Home | History | Annotate | Download | only in MCTargetDesc
      1 //===-- SparcMCAsmInfo.cpp - Sparc asm properties -------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the declarations of the SparcMCAsmInfo properties.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "SparcMCAsmInfo.h"
     15 #include "SparcMCExpr.h"
     16 #include "llvm/ADT/Triple.h"
     17 #include "llvm/MC/MCStreamer.h"
     18 
     19 using namespace llvm;
     20 
     21 void SparcELFMCAsmInfo::anchor() { }
     22 
     23 SparcELFMCAsmInfo::SparcELFMCAsmInfo(StringRef TT) {
     24   IsLittleEndian = false;
     25   Triple TheTriple(TT);
     26   bool isV9 = (TheTriple.getArch() == Triple::sparcv9);
     27 
     28   if (isV9) {
     29     PointerSize = CalleeSaveStackSlotSize = 8;
     30   }
     31 
     32   Data16bitsDirective = "\t.half\t";
     33   Data32bitsDirective = "\t.word\t";
     34   // .xword is only supported by V9.
     35   Data64bitsDirective = (isV9) ? "\t.xword\t" : nullptr;
     36   ZeroDirective = "\t.skip\t";
     37   CommentString = "!";
     38   HasLEB128 = true;
     39   SupportsDebugInformation = true;
     40 
     41   ExceptionsType = ExceptionHandling::DwarfCFI;
     42 
     43   SunStyleELFSectionSwitchSyntax = true;
     44   UsesELFSectionDirectiveForBSS = true;
     45 
     46   if (TheTriple.getOS() == llvm::Triple::Solaris)
     47     UseIntegratedAssembler = true;
     48 }
     49 
     50 const MCExpr*
     51 SparcELFMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
     52                                                unsigned Encoding,
     53                                                MCStreamer &Streamer) const {
     54   if (Encoding & dwarf::DW_EH_PE_pcrel) {
     55     MCContext &Ctx = Streamer.getContext();
     56     return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
     57                                MCSymbolRefExpr::Create(Sym, Ctx), Ctx);
     58   }
     59 
     60   return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer);
     61 }
     62 
     63 const MCExpr*
     64 SparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
     65                                        unsigned Encoding,
     66                                        MCStreamer &Streamer) const {
     67   if (Encoding & dwarf::DW_EH_PE_pcrel) {
     68     MCContext &Ctx = Streamer.getContext();
     69     return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
     70                                MCSymbolRefExpr::Create(Sym, Ctx), Ctx);
     71   }
     72   return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer);
     73 }
     74