//===- VEMCAsmInfo.cpp - VE asm properties --------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains the declarations of the VEMCAsmInfo properties. // //===----------------------------------------------------------------------===// #include "VEMCAsmInfo.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCValue.h" #include "llvm/TargetParser/Triple.h" using namespace llvm; const MCAsmInfo::AtSpecifier atSpecifiers[] = { {VE::S_HI32, "hi"}, {VE::S_LO32, "lo"}, {VE::S_PC_HI32, "pc_hi"}, {VE::S_PC_LO32, "pc_lo"}, {VE::S_GOT_HI32, "got_hi"}, {VE::S_GOT_LO32, "got_lo"}, {VE::S_GOTOFF_HI32, "gotoff_hi"}, {VE::S_GOTOFF_LO32, "gotoff_lo"}, {VE::S_PLT_HI32, "plt_hi"}, {VE::S_PLT_LO32, "plt_lo"}, {VE::S_TLS_GD_HI32, "tls_gd_hi"}, {VE::S_TLS_GD_LO32, "tls_gd_lo"}, {VE::S_TPOFF_HI32, "tpoff_hi"}, {VE::S_TPOFF_LO32, "tpoff_lo"}, }; VE::Fixups VE::getFixupKind(uint8_t S) { switch (S) { default: llvm_unreachable("Unhandled VEMCExpr::Specifier"); case VE::S_REFLONG: return VE::fixup_ve_reflong; case VE::S_HI32: return VE::fixup_ve_hi32; case VE::S_LO32: return VE::fixup_ve_lo32; case VE::S_PC_HI32: return VE::fixup_ve_pc_hi32; case VE::S_PC_LO32: return VE::fixup_ve_pc_lo32; case VE::S_GOT_HI32: return VE::fixup_ve_got_hi32; case VE::S_GOT_LO32: return VE::fixup_ve_got_lo32; case VE::S_GOTOFF_HI32: return VE::fixup_ve_gotoff_hi32; case VE::S_GOTOFF_LO32: return VE::fixup_ve_gotoff_lo32; case VE::S_PLT_HI32: return VE::fixup_ve_plt_hi32; case VE::S_PLT_LO32: return VE::fixup_ve_plt_lo32; case VE::S_TLS_GD_HI32: return VE::fixup_ve_tls_gd_hi32; case VE::S_TLS_GD_LO32: return VE::fixup_ve_tls_gd_lo32; case VE::S_TPOFF_HI32: return VE::fixup_ve_tpoff_hi32; case VE::S_TPOFF_LO32: return VE::fixup_ve_tpoff_lo32; } } void VEELFMCAsmInfo::anchor() {} VEELFMCAsmInfo::VEELFMCAsmInfo(const Triple &TheTriple) { CodePointerSize = CalleeSaveStackSlotSize = 8; MaxInstLength = MinInstAlignment = 8; // VE uses ".*byte" directive for unaligned data. Data8bitsDirective = "\t.byte\t"; Data16bitsDirective = "\t.2byte\t"; Data32bitsDirective = "\t.4byte\t"; Data64bitsDirective = "\t.8byte\t"; // Uses '.section' before '.bss' directive. VE requires this although // assembler manual says sinple '.bss' is supported. UsesELFSectionDirectiveForBSS = true; SupportsDebugInformation = true; initializeAtSpecifiers(atSpecifiers); } void VEELFMCAsmInfo::printSpecifierExpr(raw_ostream &OS, const MCSpecifierExpr &Expr) const { printExpr(OS, *Expr.getSubExpr()); auto specifier = Expr.getSpecifier(); if (specifier && specifier != VE::S_REFLONG) OS << '@' << getSpecifierName(specifier); } bool VEELFMCAsmInfo::evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const { if (!Expr.getSubExpr()->evaluateAsRelocatable(Res, Asm)) return false; Res.setSpecifier(Expr.getSpecifier()); return true; }