brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · 33fc738 Raw
218 lines · cpp
1//===-- ARMMCAsmInfo.cpp - ARM asm properties -----------------------------===//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 ARMMCAsmInfo properties.10//11//===----------------------------------------------------------------------===//12 13#include "ARMMCAsmInfo.h"14#include "llvm/MC/MCExpr.h"15#include "llvm/Support/raw_ostream.h"16#include "llvm/TargetParser/Triple.h"17 18using namespace llvm;19 20const MCAsmInfo::AtSpecifier atSpecifiers[] = {21    {ARM::S_GOT_PREL, "GOT_PREL"},22    {ARM::S_ARM_NONE, "none"},23    {ARM::S_PREL31, "prel31"},24    {ARM::S_SBREL, "sbrel"},25    {ARM::S_TARGET1, "target1"},26    {ARM::S_TARGET2, "target2"},27    {ARM::S_TLSLDO, "TLSLDO"},28    {MCSymbolRefExpr::VK_COFF_IMGREL32, "imgrel"},29    {ARM::S_FUNCDESC, "FUNCDESC"},30    {ARM::S_GOT, "GOT"},31    {ARM::S_GOTFUNCDESC, "GOTFUNCDESC"},32    {ARM::S_GOTOFF, "GOTOFF"},33    {ARM::S_GOTOFFFUNCDESC, "GOTOFFFUNCDESC"},34    {ARM::S_GOTTPOFF, "GOTTPOFF"},35    {ARM::S_GOTTPOFF_FDPIC, "gottpoff_fdpic"},36    {ARM::S_PLT, "PLT"},37    {ARM::S_COFF_SECREL, "SECREL32"},38    {ARM::S_TLSCALL, "tlscall"},39    {ARM::S_TLSDESC, "tlsdesc"},40    {ARM::S_TLSGD, "TLSGD"},41    {ARM::S_TLSGD_FDPIC, "tlsgd_fdpic"},42    {ARM::S_TLSLDM, "TLSLDM"},43    {ARM::S_TLSLDM_FDPIC, "tlsldm_fdpic"},44    {ARM::S_TPOFF, "TPOFF"},45};46 47void ARMMCAsmInfoDarwin::anchor() { }48 49ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) {50  if ((TheTriple.getArch() == Triple::armeb) ||51      (TheTriple.getArch() == Triple::thumbeb))52    IsLittleEndian = false;53 54  Data64bitsDirective = nullptr;55  CommentString = "@";56  AllowDollarAtStartOfIdentifier = false;57  UseDataRegionDirectives = true;58 59  SupportsDebugInformation = true;60 61  // Conditional Thumb 4-byte instructions can have an implicit IT.62  MaxInstLength = 6;63 64  // Exceptions handling65  ExceptionsType = (TheTriple.isOSDarwin() && !TheTriple.isWatchABI())66                       ? ExceptionHandling::SjLj67                       : ExceptionHandling::DwarfCFI;68 69  initializeAtSpecifiers(atSpecifiers);70}71 72void ARMELFMCAsmInfo::anchor() { }73 74ARMELFMCAsmInfo::ARMELFMCAsmInfo(const Triple &TheTriple) {75  if ((TheTriple.getArch() == Triple::armeb) ||76      (TheTriple.getArch() == Triple::thumbeb))77    IsLittleEndian = false;78 79  // ".comm align is in bytes but .align is pow-2."80  AlignmentIsInBytes = false;81 82  Data64bitsDirective = nullptr;83  CommentString = "@";84  AllowDollarAtStartOfIdentifier = false;85 86  SupportsDebugInformation = true;87 88  // Conditional Thumb 4-byte instructions can have an implicit IT.89  MaxInstLength = 6;90 91  // Exceptions handling92  switch (TheTriple.getOS()) {93  case Triple::NetBSD:94    ExceptionsType = ExceptionHandling::DwarfCFI;95    break;96  default:97    ExceptionsType = ExceptionHandling::ARM;98    break;99  }100 101  // foo(plt) instead of foo@plt102  UseAtForSpecifier = false;103  UseParensForSpecifier = true;104 105  initializeAtSpecifiers(atSpecifiers);106}107 108void ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) {109  UseIntegratedAssembler = Value;110  if (!UseIntegratedAssembler) {111    // gas doesn't handle VFP register names in cfi directives,112    // so don't use register names with external assembler.113    // See https://sourceware.org/bugzilla/show_bug.cgi?id=16694114    DwarfRegNumForCFI = true;115  }116}117 118void ARMCOFFMCAsmInfoMicrosoft::anchor() { }119 120ARMCOFFMCAsmInfoMicrosoft::ARMCOFFMCAsmInfoMicrosoft() {121  AlignmentIsInBytes = false;122  SupportsDebugInformation = true;123  ExceptionsType = ExceptionHandling::WinEH;124  WinEHEncodingType = WinEH::EncodingType::Itanium;125  PrivateGlobalPrefix = "$M";126  PrivateLabelPrefix = "$M";127  CommentString = "@";128 129  // Conditional Thumb 4-byte instructions can have an implicit IT.130  MaxInstLength = 6;131 132  initializeAtSpecifiers(atSpecifiers);133}134 135void ARMCOFFMCAsmInfoGNU::anchor() { }136 137ARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() {138  AlignmentIsInBytes = false;139  HasSingleParameterDotFile = true;140 141  CommentString = "@";142  AllowDollarAtStartOfIdentifier = false;143  PrivateGlobalPrefix = ".L";144  PrivateLabelPrefix = ".L";145 146  SupportsDebugInformation = true;147  ExceptionsType = ExceptionHandling::WinEH;148  WinEHEncodingType = WinEH::EncodingType::Itanium;149  UseAtForSpecifier = false;150  UseParensForSpecifier = true;151 152  DwarfRegNumForCFI = false;153 154  // Conditional Thumb 4-byte instructions can have an implicit IT.155  MaxInstLength = 6;156 157  initializeAtSpecifiers(atSpecifiers);158}159 160void ARM::printSpecifierExpr(const MCAsmInfo &MAI, raw_ostream &OS,161                             const MCSpecifierExpr &Expr) {162  switch (Expr.getSpecifier()) {163  default:164    llvm_unreachable("Invalid kind!");165  case ARM::S_HI16:166    OS << ":upper16:";167    break;168  case ARM::S_LO16:169    OS << ":lower16:";170    break;171  case ARM::S_HI_8_15:172    OS << ":upper8_15:";173    break;174  case ARM::S_HI_0_7:175    OS << ":upper0_7:";176    break;177  case ARM::S_LO_8_15:178    OS << ":lower8_15:";179    break;180  case ARM::S_LO_0_7:181    OS << ":lower0_7:";182    break;183  }184 185  const MCExpr *Sub = Expr.getSubExpr();186  if (Sub->getKind() != MCExpr::SymbolRef)187    OS << '(';188  MAI.printExpr(OS, *Sub);189  if (Sub->getKind() != MCExpr::SymbolRef)190    OS << ')';191}192 193const MCSpecifierExpr *ARM::createUpper16(const MCExpr *Expr, MCContext &Ctx) {194  return MCSpecifierExpr::create(Expr, ARM::S_HI16, Ctx);195}196 197const MCSpecifierExpr *ARM::createLower16(const MCExpr *Expr, MCContext &Ctx) {198  return MCSpecifierExpr::create(Expr, ARM::S_LO16, Ctx);199}200 201const MCSpecifierExpr *ARM::createUpper8_15(const MCExpr *Expr,202                                            MCContext &Ctx) {203  return MCSpecifierExpr::create(Expr, ARM::S_HI_8_15, Ctx);204}205 206const MCSpecifierExpr *ARM::createUpper0_7(const MCExpr *Expr, MCContext &Ctx) {207  return MCSpecifierExpr::create(Expr, ARM::S_HI_0_7, Ctx);208}209 210const MCSpecifierExpr *ARM::createLower8_15(const MCExpr *Expr,211                                            MCContext &Ctx) {212  return MCSpecifierExpr::create(Expr, ARM::S_LO_8_15, Ctx);213}214 215const MCSpecifierExpr *ARM::createLower0_7(const MCExpr *Expr, MCContext &Ctx) {216  return MCSpecifierExpr::create(Expr, ARM::S_LO_0_7, Ctx);217}218