xref: /freebsd/contrib/llvm-project/llvm/lib/MC/MCSectionGOFF.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
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 }