1224133Sdim//===-- SparcMCAsmInfo.cpp - Sparc asm properties -------------------------===//
2224133Sdim//
3224133Sdim//                     The LLVM Compiler Infrastructure
4224133Sdim//
5224133Sdim// This file is distributed under the University of Illinois Open Source
6224133Sdim// License. See LICENSE.TXT for details.
7224133Sdim//
8224133Sdim//===----------------------------------------------------------------------===//
9224133Sdim//
10224133Sdim// This file contains the declarations of the SparcMCAsmInfo properties.
11224133Sdim//
12224133Sdim//===----------------------------------------------------------------------===//
13224133Sdim
14224133Sdim#include "SparcMCAsmInfo.h"
15263764Sdim#include "SparcMCExpr.h"
16224133Sdim#include "llvm/ADT/Triple.h"
17263764Sdim#include "llvm/MC/MCStreamer.h"
18224133Sdim
19224133Sdimusing namespace llvm;
20224133Sdim
21235633Sdimvoid SparcELFMCAsmInfo::anchor() { }
22235633Sdim
23263509SdimSparcELFMCAsmInfo::SparcELFMCAsmInfo(StringRef TT) {
24224133Sdim  IsLittleEndian = false;
25224133Sdim  Triple TheTriple(TT);
26263509Sdim  bool isV9 = (TheTriple.getArch() == Triple::sparcv9);
27263509Sdim
28263509Sdim  if (isV9) {
29252723Sdim    PointerSize = CalleeSaveStackSlotSize = 8;
30252723Sdim  }
31224133Sdim
32224133Sdim  Data16bitsDirective = "\t.half\t";
33224133Sdim  Data32bitsDirective = "\t.word\t";
34263509Sdim  // .xword is only supported by V9.
35263509Sdim  Data64bitsDirective = (isV9) ? "\t.xword\t" : 0;
36224133Sdim  ZeroDirective = "\t.skip\t";
37224133Sdim  CommentString = "!";
38224133Sdim  HasLEB128 = true;
39224133Sdim  SupportsDebugInformation = true;
40263509Sdim
41263509Sdim  ExceptionsType = ExceptionHandling::DwarfCFI;
42263509Sdim
43224133Sdim  SunStyleELFSectionSwitchSyntax = true;
44224133Sdim  UsesELFSectionDirectiveForBSS = true;
45224133Sdim
46224133Sdim  PrivateGlobalPrefix = ".L";
47224133Sdim}
48224133Sdim
49263764Sdimconst MCExpr*
50263764SdimSparcELFMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
51263764Sdim                                               unsigned Encoding,
52263764Sdim                                               MCStreamer &Streamer) const {
53263764Sdim  if (Encoding & dwarf::DW_EH_PE_pcrel) {
54263764Sdim    MCContext &Ctx = Streamer.getContext();
55263764Sdim    return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
56263764Sdim                               MCSymbolRefExpr::Create(Sym, Ctx), Ctx);
57263764Sdim  }
58224133Sdim
59263764Sdim  return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer);
60263764Sdim}
61263764Sdim
62263764Sdimconst MCExpr*
63263764SdimSparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
64263764Sdim                                       unsigned Encoding,
65263764Sdim                                       MCStreamer &Streamer) const {
66263764Sdim  if (Encoding & dwarf::DW_EH_PE_pcrel) {
67263764Sdim    MCContext &Ctx = Streamer.getContext();
68263764Sdim    return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
69263764Sdim                               MCSymbolRefExpr::Create(Sym, Ctx), Ctx);
70263764Sdim  }
71263764Sdim  return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer);
72263764Sdim}
73