1 | //===- SparcMCAsmInfo.cpp - Sparc 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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file contains the declarations of the SparcMCAsmInfo properties. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #include "SparcMCAsmInfo.h" |
14 | #include "SparcMCExpr.h" |
15 | #include "llvm/BinaryFormat/Dwarf.h" |
16 | #include "llvm/MC/MCExpr.h" |
17 | #include "llvm/MC/MCStreamer.h" |
18 | #include "llvm/MC/MCTargetOptions.h" |
19 | #include "llvm/TargetParser/Triple.h" |
20 | |
21 | using namespace llvm; |
22 | |
23 | void SparcELFMCAsmInfo::anchor() {} |
24 | |
25 | SparcELFMCAsmInfo::SparcELFMCAsmInfo(const Triple &TheTriple) { |
26 | bool isV9 = (TheTriple.getArch() == Triple::sparcv9); |
27 | IsLittleEndian = (TheTriple.getArch() == Triple::sparcel); |
28 | |
29 | if (isV9) { |
30 | CodePointerSize = CalleeSaveStackSlotSize = 8; |
31 | } |
32 | |
33 | Data16bitsDirective = "\t.half\t" ; |
34 | Data32bitsDirective = "\t.word\t" ; |
35 | // .xword is only supported by V9. |
36 | Data64bitsDirective = (isV9) ? "\t.xword\t" : nullptr; |
37 | ZeroDirective = "\t.skip\t" ; |
38 | CommentString = "!" ; |
39 | SupportsDebugInformation = true; |
40 | |
41 | ExceptionsType = ExceptionHandling::DwarfCFI; |
42 | |
43 | UsesELFSectionDirectiveForBSS = true; |
44 | } |
45 | |
46 | const MCExpr* |
47 | SparcELFMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, |
48 | unsigned Encoding, |
49 | MCStreamer &Streamer) const { |
50 | if (Encoding & dwarf::DW_EH_PE_pcrel) { |
51 | MCContext &Ctx = Streamer.getContext(); |
52 | return SparcMCExpr::create(Kind: SparcMCExpr::VK_Sparc_R_DISP32, |
53 | Expr: MCSymbolRefExpr::create(Symbol: Sym, Ctx), Ctx); |
54 | } |
55 | |
56 | return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer); |
57 | } |
58 | |
59 | const MCExpr* |
60 | SparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, |
61 | unsigned Encoding, |
62 | MCStreamer &Streamer) const { |
63 | if (Encoding & dwarf::DW_EH_PE_pcrel) { |
64 | MCContext &Ctx = Streamer.getContext(); |
65 | return SparcMCExpr::create(Kind: SparcMCExpr::VK_Sparc_R_DISP32, |
66 | Expr: MCSymbolRefExpr::create(Symbol: Sym, Ctx), Ctx); |
67 | } |
68 | return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer); |
69 | } |
70 | |