brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.9 KiB · 8ecb62d Raw
225 lines · cpp
1//===-- LoongArchMCAsmInfo.cpp - LoongArch Asm properties ------*- C++ -*--===//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 declarations of the LoongArchMCAsmInfo properties.10//11//===----------------------------------------------------------------------===//12 13#include "LoongArchMCAsmInfo.h"14#include "llvm/BinaryFormat/Dwarf.h"15#include "llvm/BinaryFormat/ELF.h"16#include "llvm/MC/MCContext.h"17#include "llvm/MC/MCStreamer.h"18#include "llvm/TargetParser/Triple.h"19 20using namespace llvm;21 22const LoongArchMCExpr *LoongArchMCExpr::create(const MCExpr *Expr, uint16_t S,23                                               MCContext &Ctx, bool Hint) {24  return new (Ctx) LoongArchMCExpr(Expr, S, Hint);25}26 27static StringRef getLoongArchSpecifierName(uint16_t S) {28  switch (S) {29  default:30    llvm_unreachable("Invalid ELF symbol kind");31  case ELF::R_LARCH_B16:32    return "b16";33  case ELF::R_LARCH_B21:34    return "b21";35  case ELF::R_LARCH_MARK_LA:36  case ELF::R_LARCH_ABS_HI20:37    return "abs_hi20";38  case ELF::R_LARCH_ABS_LO12:39    return "abs_lo12";40  case ELF::R_LARCH_ABS64_LO20:41    return "abs64_lo20";42  case ELF::R_LARCH_ABS64_HI12:43    return "abs64_hi12";44  case ELF::R_LARCH_PCALA_HI20:45    return "pc_hi20";46  case ELF::R_LARCH_PCALA_LO12:47    return "pc_lo12";48  case ELF::R_LARCH_PCALA64_LO20:49    return "pc64_lo20";50  case ELF::R_LARCH_PCALA64_HI12:51    return "pc64_hi12";52  case ELF::R_LARCH_GOT_PC_HI20:53    return "got_pc_hi20";54  case ELF::R_LARCH_GOT_PC_LO12:55    return "got_pc_lo12";56  case ELF::R_LARCH_GOT64_PC_LO20:57    return "got64_pc_lo20";58  case ELF::R_LARCH_GOT64_PC_HI12:59    return "got64_pc_hi12";60  case ELF::R_LARCH_GOT_HI20:61    return "got_hi20";62  case ELF::R_LARCH_GOT_LO12:63    return "got_lo12";64  case ELF::R_LARCH_GOT64_LO20:65    return "got64_lo20";66  case ELF::R_LARCH_GOT64_HI12:67    return "got64_hi12";68  case ELF::R_LARCH_TLS_LE_HI20:69    return "le_hi20";70  case ELF::R_LARCH_TLS_LE_LO12:71    return "le_lo12";72  case ELF::R_LARCH_TLS_LE64_LO20:73    return "le64_lo20";74  case ELF::R_LARCH_TLS_LE64_HI12:75    return "le64_hi12";76  case ELF::R_LARCH_TLS_IE_PC_HI20:77    return "ie_pc_hi20";78  case ELF::R_LARCH_TLS_IE_PC_LO12:79    return "ie_pc_lo12";80  case ELF::R_LARCH_TLS_IE64_PC_LO20:81    return "ie64_pc_lo20";82  case ELF::R_LARCH_TLS_IE64_PC_HI12:83    return "ie64_pc_hi12";84  case ELF::R_LARCH_TLS_IE_HI20:85    return "ie_hi20";86  case ELF::R_LARCH_TLS_IE_LO12:87    return "ie_lo12";88  case ELF::R_LARCH_TLS_IE64_LO20:89    return "ie64_lo20";90  case ELF::R_LARCH_TLS_IE64_HI12:91    return "ie64_hi12";92  case ELF::R_LARCH_TLS_LD_PC_HI20:93    return "ld_pc_hi20";94  case ELF::R_LARCH_TLS_LD_HI20:95    return "ld_hi20";96  case ELF::R_LARCH_TLS_GD_PC_HI20:97    return "gd_pc_hi20";98  case ELF::R_LARCH_TLS_GD_HI20:99    return "gd_hi20";100  case ELF::R_LARCH_CALL36:101    return "call36";102  case ELF::R_LARCH_TLS_DESC_PC_HI20:103    return "desc_pc_hi20";104  case ELF::R_LARCH_TLS_DESC_PC_LO12:105    return "desc_pc_lo12";106  case ELF::R_LARCH_TLS_DESC64_PC_LO20:107    return "desc64_pc_lo20";108  case ELF::R_LARCH_TLS_DESC64_PC_HI12:109    return "desc64_pc_hi12";110  case ELF::R_LARCH_TLS_DESC_HI20:111    return "desc_hi20";112  case ELF::R_LARCH_TLS_DESC_LO12:113    return "desc_lo12";114  case ELF::R_LARCH_TLS_DESC64_LO20:115    return "desc64_lo20";116  case ELF::R_LARCH_TLS_DESC64_HI12:117    return "desc64_hi12";118  case ELF::R_LARCH_TLS_DESC_LD:119    return "desc_ld";120  case ELF::R_LARCH_TLS_DESC_CALL:121    return "desc_call";122  case ELF::R_LARCH_TLS_LE_HI20_R:123    return "le_hi20_r";124  case ELF::R_LARCH_TLS_LE_ADD_R:125    return "le_add_r";126  case ELF::R_LARCH_TLS_LE_LO12_R:127    return "le_lo12_r";128  case ELF::R_LARCH_PCREL20_S2:129    return "pcrel_20";130  case ELF::R_LARCH_TLS_LD_PCREL20_S2:131    return "ld_pcrel_20";132  case ELF::R_LARCH_TLS_GD_PCREL20_S2:133    return "gd_pcrel_20";134  case ELF::R_LARCH_TLS_DESC_PCREL20_S2:135    return "desc_pcrel_20";136  }137}138 139LoongArchMCExpr::Specifier LoongArch::parseSpecifier(StringRef name) {140  return StringSwitch<LoongArchMCExpr::Specifier>(name)141      .Case("plt", ELF::R_LARCH_B26)142      .Case("b16", ELF::R_LARCH_B16)143      .Case("b21", ELF::R_LARCH_B21)144      .Case("b26", ELF::R_LARCH_B26)145      .Case("abs_hi20", ELF::R_LARCH_ABS_HI20)146      .Case("abs_lo12", ELF::R_LARCH_ABS_LO12)147      .Case("abs64_lo20", ELF::R_LARCH_ABS64_LO20)148      .Case("abs64_hi12", ELF::R_LARCH_ABS64_HI12)149      .Case("pc_hi20", ELF::R_LARCH_PCALA_HI20)150      .Case("pc_lo12", ELF::R_LARCH_PCALA_LO12)151      .Case("pc64_lo20", ELF::R_LARCH_PCALA64_LO20)152      .Case("pc64_hi12", ELF::R_LARCH_PCALA64_HI12)153      .Case("got_pc_hi20", ELF::R_LARCH_GOT_PC_HI20)154      .Case("got_pc_lo12", ELF::R_LARCH_GOT_PC_LO12)155      .Case("got64_pc_lo20", ELF::R_LARCH_GOT64_PC_LO20)156      .Case("got64_pc_hi12", ELF::R_LARCH_GOT64_PC_HI12)157      .Case("got_hi20", ELF::R_LARCH_GOT_HI20)158      .Case("got_lo12", ELF::R_LARCH_GOT_LO12)159      .Case("got64_lo20", ELF::R_LARCH_GOT64_LO20)160      .Case("got64_hi12", ELF::R_LARCH_GOT64_HI12)161      .Case("le_hi20", ELF::R_LARCH_TLS_LE_HI20)162      .Case("le_lo12", ELF::R_LARCH_TLS_LE_LO12)163      .Case("le64_lo20", ELF::R_LARCH_TLS_LE64_LO20)164      .Case("le64_hi12", ELF::R_LARCH_TLS_LE64_HI12)165      .Case("ie_pc_hi20", ELF::R_LARCH_TLS_IE_PC_HI20)166      .Case("ie_pc_lo12", ELF::R_LARCH_TLS_IE_PC_LO12)167      .Case("ie64_pc_lo20", ELF::R_LARCH_TLS_IE64_PC_LO20)168      .Case("ie64_pc_hi12", ELF::R_LARCH_TLS_IE64_PC_HI12)169      .Case("ie_hi20", ELF::R_LARCH_TLS_IE_HI20)170      .Case("ie_lo12", ELF::R_LARCH_TLS_IE_LO12)171      .Case("ie64_lo20", ELF::R_LARCH_TLS_IE64_LO20)172      .Case("ie64_hi12", ELF::R_LARCH_TLS_IE64_HI12)173      .Case("ld_pc_hi20", ELF::R_LARCH_TLS_LD_PC_HI20)174      .Case("ld_hi20", ELF::R_LARCH_TLS_LD_HI20)175      .Case("gd_pc_hi20", ELF::R_LARCH_TLS_GD_PC_HI20)176      .Case("gd_hi20", ELF::R_LARCH_TLS_GD_HI20)177      .Case("call36", ELF::R_LARCH_CALL36)178      .Case("desc_pc_hi20", ELF::R_LARCH_TLS_DESC_PC_HI20)179      .Case("desc_pc_lo12", ELF::R_LARCH_TLS_DESC_PC_LO12)180      .Case("desc64_pc_lo20", ELF::R_LARCH_TLS_DESC64_PC_LO20)181      .Case("desc64_pc_hi12", ELF::R_LARCH_TLS_DESC64_PC_HI12)182      .Case("desc_hi20", ELF::R_LARCH_TLS_DESC_HI20)183      .Case("desc_lo12", ELF::R_LARCH_TLS_DESC_LO12)184      .Case("desc64_lo20", ELF::R_LARCH_TLS_DESC64_LO20)185      .Case("desc64_hi12", ELF::R_LARCH_TLS_DESC64_HI12)186      .Case("desc_ld", ELF::R_LARCH_TLS_DESC_LD)187      .Case("desc_call", ELF::R_LARCH_TLS_DESC_CALL)188      .Case("le_hi20_r", ELF::R_LARCH_TLS_LE_HI20_R)189      .Case("le_add_r", ELF::R_LARCH_TLS_LE_ADD_R)190      .Case("le_lo12_r", ELF::R_LARCH_TLS_LE_LO12_R)191      .Case("pcrel_20", ELF::R_LARCH_PCREL20_S2)192      .Case("ld_pcrel_20", ELF::R_LARCH_TLS_LD_PCREL20_S2)193      .Case("gd_pcrel_20", ELF::R_LARCH_TLS_GD_PCREL20_S2)194      .Case("desc_pcrel_20", ELF::R_LARCH_TLS_DESC_PCREL20_S2)195      .Default(0);196}197 198void LoongArchMCAsmInfo::anchor() {}199 200LoongArchMCAsmInfo::LoongArchMCAsmInfo(const Triple &TT) {201  CodePointerSize = CalleeSaveStackSlotSize = TT.isArch64Bit() ? 8 : 4;202  AlignmentIsInBytes = false;203  Data8bitsDirective = "\t.byte\t";204  Data16bitsDirective = "\t.half\t";205  Data32bitsDirective = "\t.word\t";206  Data64bitsDirective = "\t.dword\t";207  ZeroDirective = "\t.space\t";208  CommentString = "#";209  AllowDollarAtStartOfIdentifier = false;210  SupportsDebugInformation = true;211  DwarfRegNumForCFI = true;212  ExceptionsType = ExceptionHandling::DwarfCFI;213}214 215void LoongArchMCAsmInfo::printSpecifierExpr(raw_ostream &OS,216                                            const MCSpecifierExpr &Expr) const {217  auto S = Expr.getSpecifier();218  bool HasSpecifier = S != 0 && S != ELF::R_LARCH_B26;219  if (HasSpecifier)220    OS << '%' << getLoongArchSpecifierName(S) << '(';221  printExpr(OS, *Expr.getSubExpr());222  if (HasSpecifier)223    OS << ')';224}225