1//===-- PPCMCAsmInfo.h - PPC asm properties --------------------*- C++ -*--===//
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 PowerPC MCAsmInfo classes.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H
14#define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H
15
16#include "llvm/MC/MCAsmInfoELF.h"
17#include "llvm/MC/MCAsmInfoXCOFF.h"
18#include "llvm/MC/MCExpr.h"
19#include "llvm/MC/MCValue.h"
20
21namespace llvm {
22class Triple;
23
24class PPCELFMCAsmInfo : public MCAsmInfoELF {
25 void anchor() override;
26
27public:
28 explicit PPCELFMCAsmInfo(bool is64Bit, const Triple &);
29 void printSpecifierExpr(raw_ostream &OS,
30 const MCSpecifierExpr &Expr) const override;
31 bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
32 const MCAssembler *Asm) const override;
33};
34
35class PPCXCOFFMCAsmInfo : public MCAsmInfoXCOFF {
36public:
37 explicit PPCXCOFFMCAsmInfo(bool is64Bit, const Triple &);
38 void printSpecifierExpr(raw_ostream &OS,
39 const MCSpecifierExpr &Expr) const override;
40 bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
41 const MCAssembler *Asm) const override;
42};
43
44namespace PPC {
45enum Specifier {
46 S_None,
47
48 S_LO,
49 S_HI,
50 S_HA,
51 S_HIGH,
52 S_HIGHA,
53 S_HIGHER,
54 S_HIGHERA,
55 S_HIGHEST,
56 S_HIGHESTA,
57
58 S_AIX_TLSGD, // symbol@gd
59 S_AIX_TLSGDM, // symbol@m
60 S_AIX_TLSIE, // symbol@ie
61 S_AIX_TLSLD, // symbol@ld
62 S_AIX_TLSLE, // symbol@le
63 S_AIX_TLSML, // symbol@ml
64 S_DTPMOD, // symbol@dtpmod
65 S_DTPREL, // symbol@dprel
66 S_DTPREL_HA, // symbol@dtprel@ha
67 S_DTPREL_HI, // symbol@dtprel@h
68 S_DTPREL_HIGH, // symbol@dtprel@high
69 S_DTPREL_HIGHA, // symbol@dtprel@higha
70 S_DTPREL_HIGHER, // symbol@dtprel@higher
71 S_DTPREL_HIGHERA, // symbol@dtprel@highera
72 S_DTPREL_HIGHEST, // symbol@dtprel@highest
73 S_DTPREL_HIGHESTA, // symbol@dtprel@highesta
74 S_DTPREL_LO, // symbol@dtprel@l
75 S_GOT, // symbol@got
76 S_GOT_DTPREL, // symbol@got@dtprel
77 S_GOT_DTPREL_HA, // symbol@got@dtprel@ha
78 S_GOT_DTPREL_HI, // symbol@got@dtprel@h
79 S_GOT_DTPREL_LO, // symbol@got@dtprel@l
80 S_GOT_HA, // symbol@got@ha
81 S_GOT_HI, // symbol@got@h
82 S_GOT_LO, // symbol@got@l
83 S_GOT_PCREL, // symbol@got@pcrel
84 S_GOT_TLSGD, // symbol@got@tlsgd
85 S_GOT_TLSGD_HA, // symbol@got@tlsgd@ha
86 S_GOT_TLSGD_HI, // symbol@got@tlsgd@h
87 S_GOT_TLSGD_LO, // symbol@got@tlsgd@l
88 S_GOT_TLSGD_PCREL, // symbol@got@tlsgd@pcrel
89 S_GOT_TLSLD, // symbol@got@tlsld
90 S_GOT_TLSLD_HA, // symbol@got@tlsld@ha
91 S_GOT_TLSLD_HI, // symbol@got@tlsld@h
92 S_GOT_TLSLD_LO, // symbol@got@tlsld@l
93 S_GOT_TLSLD_PCREL, // symbol@got@tlsld@pcrel
94 S_GOT_TPREL, // symbol@got@tprel
95 S_GOT_TPREL_HA, // symbol@got@tprel@ha
96 S_GOT_TPREL_HI, // symbol@got@tprel@h
97 S_GOT_TPREL_LO, // symbol@got@tprel@l
98 S_GOT_TPREL_PCREL, // symbol@got@tprel@pcrel
99 S_L, // symbol@l
100 S_LOCAL, // symbol@local
101 S_NOTOC, // symbol@notoc
102 S_PCREL,
103 S_PCREL_OPT, // .reloc expr, R_PPC64_PCREL_OPT, expr
104 S_PLT, // symbol@plt
105 S_TLS, // symbol@tls
106 S_TLSGD, // symbol@tlsgd
107 S_TLSLD, // symbol@tlsld
108 S_TLS_PCREL, // symbol@tls@pcrel
109 S_TOC, // symbol@toc
110 S_TOCBASE, // symbol@tocbase
111 S_TOC_HA, // symbol@toc@ha
112 S_TOC_HI, // symbol@toc@h
113 S_TOC_LO, // symbol@toc@l
114 S_TPREL, // symbol@tprel
115 S_TPREL_HA, // symbol@tprel@ha
116 S_TPREL_HI, // symbol@tprel@h
117 S_TPREL_HIGH, // symbol@tprel@high
118 S_TPREL_HIGHA, // symbol@tprel@higha
119 S_TPREL_HIGHER, // symbol@tprel@higher
120 S_TPREL_HIGHERA, // symbol@tprel@highera
121 S_TPREL_HIGHEST, // symbol@tprel@highest
122 S_TPREL_HIGHESTA, // symbol@tprel@highesta
123 S_TPREL_LO, // symbol@tprel@l
124 S_U, // symbol@u
125};
126
127bool evaluateAsConstant(const MCSpecifierExpr &Expr, int64_t &Res);
128}
129
130namespace PPCMCExpr {
131using Specifier = uint16_t;
132}
133
134static inline uint16_t getSpecifier(const MCSymbolRefExpr *SRE) {
135 return SRE->getKind();
136}
137} // namespace llvm
138
139#endif
140