1+ // ===- MCSectionGOFF.cpp - GOFF Code Section Representation ---------------===//
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+ #include " llvm/MC/MCSectionGOFF.h"
10+ #include " llvm/BinaryFormat/GOFF.h"
11+ #include " llvm/Support/raw_ostream.h"
12+
13+ using namespace llvm ;
14+
15+ namespace {
16+ void emitRMode (raw_ostream &OS, GOFF::ESDRmode Rmode, bool UseParenthesis) {
17+ if (Rmode != GOFF::ESD_RMODE_None) {
18+ OS << " RMODE" << (UseParenthesis ? ' (' : ' ' );
19+ switch (Rmode) {
20+ case GOFF::ESD_RMODE_24:
21+ OS << " 24" ;
22+ break ;
23+ case GOFF::ESD_RMODE_31:
24+ OS << " 31" ;
25+ break ;
26+ case GOFF::ESD_RMODE_64:
27+ OS << " 64" ;
28+ break ;
29+ case GOFF::ESD_RMODE_None:
30+ break ;
31+ }
32+ if (UseParenthesis)
33+ OS << ' )' ;
34+ }
35+ }
36+
37+ void emitCATTR (raw_ostream &OS, StringRef Name, StringRef ParentName,
38+ bool EmitAmodeAndRmode, GOFF::ESDAmode Amode,
39+ GOFF::ESDRmode Rmode, GOFF::ESDAlignment Alignment,
40+ GOFF::ESDLoadingBehavior LoadBehavior,
41+ GOFF::ESDExecutable Executable, bool IsReadOnly,
42+ StringRef PartName) {
43+ if (EmitAmodeAndRmode && Amode != GOFF::ESD_AMODE_None) {
44+ OS << ParentName << " AMODE " ;
45+ switch (Amode) {
46+ case GOFF::ESD_AMODE_24:
47+ OS << " 24" ;
48+ break ;
49+ case GOFF::ESD_AMODE_31:
50+ OS << " 31" ;
51+ break ;
52+ case GOFF::ESD_AMODE_ANY:
53+ OS << " ANY" ;
54+ break ;
55+ case GOFF::ESD_AMODE_64:
56+ OS << " 64" ;
57+ break ;
58+ case GOFF::ESD_AMODE_MIN:
59+ OS << " ANY64" ;
60+ break ;
61+ case GOFF::ESD_AMODE_None:
62+ break ;
63+ }
64+ OS << " \n " ;
65+ }
66+ if (EmitAmodeAndRmode && Rmode != GOFF::ESD_RMODE_None) {
67+ OS << ParentName << ' ' ;
68+ emitRMode (OS, Rmode, /* UseParenthesis=*/ false );
69+ OS << " \n " ;
70+ }
71+ OS << Name << " CATTR " ;
72+ OS << " ALIGN(" << static_cast <unsigned >(Alignment) << " )" ;
73+ switch (LoadBehavior) {
74+ case GOFF::ESD_LB_Deferred:
75+ OS << " ,DEFLOAD" ;
76+ break ;
77+ case GOFF::ESD_LB_NoLoad:
78+ OS << " ,NOLOAD" ;
79+ break ;
80+ default :
81+ break ;
82+ }
83+ switch (Executable) {
84+ case GOFF::ESD_EXE_CODE:
85+ OS << " ,EXECUTABLE" ;
86+ break ;
87+ case GOFF::ESD_EXE_DATA:
88+ OS << " ,NOTEXECUTABLE" ;
89+ break ;
90+ default :
91+ break ;
92+ }
93+ if (IsReadOnly)
94+ OS << " ,READONLY" ;
95+ if (Rmode != GOFF::ESD_RMODE_None) {
96+ OS << ' ,' ;
97+ emitRMode (OS, Rmode, /* UseParenthesis=*/ true );
98+ }
99+ if (!PartName.empty ())
100+ OS << " ,PART(" << PartName << " )" ;
101+ OS << ' \n ' ;
102+ }
103+ } // namespace
104+
105+ void MCSectionGOFF::printSwitchToSection (const MCAsmInfo &MAI, const Triple &T,
106+ raw_ostream &OS,
107+ uint32_t Subsection) const {
108+ switch (SymbolType) {
109+ case GOFF::ESD_ST_SectionDefinition: {
110+ OS << Name << " CSECT\n " ;
111+ Emitted = true ;
112+ break ;
113+ }
114+ case GOFF::ESD_ST_ElementDefinition: {
115+ bool ParentEmitted = getParent ()->Emitted ;
116+ getParent ()->printSwitchToSection (MAI, T, OS, Subsection);
117+ if (!Emitted) {
118+ emitCATTR (OS, Name, getParent ()->getName (), !ParentEmitted,
119+ EDAttributes.Amode , EDAttributes.Rmode , EDAttributes.Alignment ,
120+ EDAttributes.LoadBehavior , EDAttributes.Executable ,
121+ EDAttributes.IsReadOnly , StringRef ());
122+ Emitted = true ;
123+ } else
124+ OS << Name << " CATTR ,\n " ;
125+ break ;
126+ }
127+ case GOFF::ESD_ST_PartReference: {
128+ MCSectionGOFF *ED = getParent ();
129+ bool SDEmitted = ED->getParent ()->Emitted ;
130+ ED->getParent ()->printSwitchToSection (MAI, T, OS, Subsection);
131+ if (!Emitted) {
132+ emitCATTR (OS, ED->getName (), ED->getParent ()->getName (), !SDEmitted,
133+ PRAttributes.Amode , getParent ()->EDAttributes .Rmode ,
134+ PRAttributes.Alignment , getParent ()->EDAttributes .LoadBehavior ,
135+ PRAttributes.Executable , PRAttributes.IsReadOnly , Name);
136+ ED->Emitted = true ;
137+ Emitted = true ;
138+ } else
139+ OS << ED->getName () << " CATTR ,\n " ;
140+ break ;
141+ }
142+ default :
143+ llvm_unreachable (" Wrong section type" );
144+ }
145+ }
0 commit comments