1*700637cbSDimitry Andric //===- MCSectionGOFF.cpp - GOFF Code Section Representation ---------------===//
2*700637cbSDimitry Andric //
3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*700637cbSDimitry Andric //
7*700637cbSDimitry Andric //===----------------------------------------------------------------------===//
8*700637cbSDimitry Andric
9*700637cbSDimitry Andric #include "llvm/MC/MCSectionGOFF.h"
10*700637cbSDimitry Andric #include "llvm/BinaryFormat/GOFF.h"
11*700637cbSDimitry Andric #include "llvm/Support/raw_ostream.h"
12*700637cbSDimitry Andric
13*700637cbSDimitry Andric using namespace llvm;
14*700637cbSDimitry Andric
emitCATTR(raw_ostream & OS,StringRef Name,GOFF::ESDRmode Rmode,GOFF::ESDAlignment Alignment,GOFF::ESDLoadingBehavior LoadBehavior,GOFF::ESDExecutable Executable,bool IsReadOnly,uint32_t SortKey,uint8_t FillByteValue,StringRef PartName)15*700637cbSDimitry Andric static void emitCATTR(raw_ostream &OS, StringRef Name, GOFF::ESDRmode Rmode,
16*700637cbSDimitry Andric GOFF::ESDAlignment Alignment,
17*700637cbSDimitry Andric GOFF::ESDLoadingBehavior LoadBehavior,
18*700637cbSDimitry Andric GOFF::ESDExecutable Executable, bool IsReadOnly,
19*700637cbSDimitry Andric uint32_t SortKey, uint8_t FillByteValue,
20*700637cbSDimitry Andric StringRef PartName) {
21*700637cbSDimitry Andric OS << Name << " CATTR ";
22*700637cbSDimitry Andric OS << "ALIGN(" << static_cast<unsigned>(Alignment) << "),"
23*700637cbSDimitry Andric << "FILL(" << static_cast<unsigned>(FillByteValue) << ")";
24*700637cbSDimitry Andric switch (LoadBehavior) {
25*700637cbSDimitry Andric case GOFF::ESD_LB_Deferred:
26*700637cbSDimitry Andric OS << ",DEFLOAD";
27*700637cbSDimitry Andric break;
28*700637cbSDimitry Andric case GOFF::ESD_LB_NoLoad:
29*700637cbSDimitry Andric OS << ",NOLOAD";
30*700637cbSDimitry Andric break;
31*700637cbSDimitry Andric default:
32*700637cbSDimitry Andric break;
33*700637cbSDimitry Andric }
34*700637cbSDimitry Andric switch (Executable) {
35*700637cbSDimitry Andric case GOFF::ESD_EXE_CODE:
36*700637cbSDimitry Andric OS << ",EXECUTABLE";
37*700637cbSDimitry Andric break;
38*700637cbSDimitry Andric case GOFF::ESD_EXE_DATA:
39*700637cbSDimitry Andric OS << ",NOTEXECUTABLE";
40*700637cbSDimitry Andric break;
41*700637cbSDimitry Andric default:
42*700637cbSDimitry Andric break;
43*700637cbSDimitry Andric }
44*700637cbSDimitry Andric if (IsReadOnly)
45*700637cbSDimitry Andric OS << ",READONLY";
46*700637cbSDimitry Andric if (Rmode != GOFF::ESD_RMODE_None) {
47*700637cbSDimitry Andric OS << ',';
48*700637cbSDimitry Andric OS << "RMODE(";
49*700637cbSDimitry Andric switch (Rmode) {
50*700637cbSDimitry Andric case GOFF::ESD_RMODE_24:
51*700637cbSDimitry Andric OS << "24";
52*700637cbSDimitry Andric break;
53*700637cbSDimitry Andric case GOFF::ESD_RMODE_31:
54*700637cbSDimitry Andric OS << "31";
55*700637cbSDimitry Andric break;
56*700637cbSDimitry Andric case GOFF::ESD_RMODE_64:
57*700637cbSDimitry Andric OS << "64";
58*700637cbSDimitry Andric break;
59*700637cbSDimitry Andric case GOFF::ESD_RMODE_None:
60*700637cbSDimitry Andric break;
61*700637cbSDimitry Andric }
62*700637cbSDimitry Andric OS << ')';
63*700637cbSDimitry Andric }
64*700637cbSDimitry Andric if (SortKey)
65*700637cbSDimitry Andric OS << ",PRIORITY(" << SortKey << ")";
66*700637cbSDimitry Andric if (!PartName.empty())
67*700637cbSDimitry Andric OS << ",PART(" << PartName << ")";
68*700637cbSDimitry Andric OS << '\n';
69*700637cbSDimitry Andric }
70*700637cbSDimitry Andric
emitXATTR(raw_ostream & OS,StringRef Name,GOFF::ESDLinkageType Linkage,GOFF::ESDExecutable Executable,GOFF::ESDBindingScope BindingScope)71*700637cbSDimitry Andric static void emitXATTR(raw_ostream &OS, StringRef Name,
72*700637cbSDimitry Andric GOFF::ESDLinkageType Linkage,
73*700637cbSDimitry Andric GOFF::ESDExecutable Executable,
74*700637cbSDimitry Andric GOFF::ESDBindingScope BindingScope) {
75*700637cbSDimitry Andric OS << Name << " XATTR ";
76*700637cbSDimitry Andric OS << "LINKAGE(" << (Linkage == GOFF::ESD_LT_OS ? "OS" : "XPLINK") << "),";
77*700637cbSDimitry Andric if (Executable != GOFF::ESD_EXE_Unspecified)
78*700637cbSDimitry Andric OS << "REFERENCE(" << (Executable == GOFF::ESD_EXE_CODE ? "CODE" : "DATA")
79*700637cbSDimitry Andric << "),";
80*700637cbSDimitry Andric if (BindingScope != GOFF::ESD_BSC_Unspecified) {
81*700637cbSDimitry Andric OS << "SCOPE(";
82*700637cbSDimitry Andric switch (BindingScope) {
83*700637cbSDimitry Andric case GOFF::ESD_BSC_Section:
84*700637cbSDimitry Andric OS << "SECTION";
85*700637cbSDimitry Andric break;
86*700637cbSDimitry Andric case GOFF::ESD_BSC_Module:
87*700637cbSDimitry Andric OS << "MODULE";
88*700637cbSDimitry Andric break;
89*700637cbSDimitry Andric case GOFF::ESD_BSC_Library:
90*700637cbSDimitry Andric OS << "LIBRARY";
91*700637cbSDimitry Andric break;
92*700637cbSDimitry Andric case GOFF::ESD_BSC_ImportExport:
93*700637cbSDimitry Andric OS << "EXPORT";
94*700637cbSDimitry Andric break;
95*700637cbSDimitry Andric default:
96*700637cbSDimitry Andric break;
97*700637cbSDimitry Andric }
98*700637cbSDimitry Andric OS << ')';
99*700637cbSDimitry Andric }
100*700637cbSDimitry Andric OS << '\n';
101*700637cbSDimitry Andric }
102*700637cbSDimitry Andric
printSwitchToSection(const MCAsmInfo & MAI,const Triple & T,raw_ostream & OS,uint32_t Subsection) const103*700637cbSDimitry Andric void MCSectionGOFF::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
104*700637cbSDimitry Andric raw_ostream &OS,
105*700637cbSDimitry Andric uint32_t Subsection) const {
106*700637cbSDimitry Andric switch (SymbolType) {
107*700637cbSDimitry Andric case GOFF::ESD_ST_SectionDefinition: {
108*700637cbSDimitry Andric OS << Name << " CSECT\n";
109*700637cbSDimitry Andric Emitted = true;
110*700637cbSDimitry Andric break;
111*700637cbSDimitry Andric }
112*700637cbSDimitry Andric case GOFF::ESD_ST_ElementDefinition: {
113*700637cbSDimitry Andric getParent()->printSwitchToSection(MAI, T, OS, Subsection);
114*700637cbSDimitry Andric if (!Emitted) {
115*700637cbSDimitry Andric emitCATTR(OS, Name, EDAttributes.Rmode, EDAttributes.Alignment,
116*700637cbSDimitry Andric EDAttributes.LoadBehavior, GOFF::ESD_EXE_Unspecified,
117*700637cbSDimitry Andric EDAttributes.IsReadOnly, 0, EDAttributes.FillByteValue,
118*700637cbSDimitry Andric StringRef());
119*700637cbSDimitry Andric Emitted = true;
120*700637cbSDimitry Andric } else
121*700637cbSDimitry Andric OS << Name << " CATTR\n";
122*700637cbSDimitry Andric break;
123*700637cbSDimitry Andric }
124*700637cbSDimitry Andric case GOFF::ESD_ST_PartReference: {
125*700637cbSDimitry Andric MCSectionGOFF *ED = getParent();
126*700637cbSDimitry Andric ED->getParent()->printSwitchToSection(MAI, T, OS, Subsection);
127*700637cbSDimitry Andric if (!Emitted) {
128*700637cbSDimitry Andric emitCATTR(OS, ED->getName(), ED->getEDAttributes().Rmode,
129*700637cbSDimitry Andric ED->EDAttributes.Alignment, ED->EDAttributes.LoadBehavior,
130*700637cbSDimitry Andric PRAttributes.Executable, ED->EDAttributes.IsReadOnly,
131*700637cbSDimitry Andric PRAttributes.SortKey, ED->EDAttributes.FillByteValue, Name);
132*700637cbSDimitry Andric emitXATTR(OS, Name, PRAttributes.Linkage, PRAttributes.Executable,
133*700637cbSDimitry Andric PRAttributes.BindingScope);
134*700637cbSDimitry Andric ED->Emitted = true;
135*700637cbSDimitry Andric Emitted = true;
136*700637cbSDimitry Andric } else
137*700637cbSDimitry Andric OS << ED->getName() << " CATTR PART(" << Name << ")\n";
138*700637cbSDimitry Andric break;
139*700637cbSDimitry Andric }
140*700637cbSDimitry Andric default:
141*700637cbSDimitry Andric llvm_unreachable("Wrong section type");
142*700637cbSDimitry Andric }
143*700637cbSDimitry Andric }