1 //===- lib/MC/MCSectionXCOFF.cpp - XCOFF 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/MCSectionXCOFF.h" 10 #include "llvm/MC/MCAsmInfo.h" 11 #include "llvm/MC/MCExpr.h" 12 #include "llvm/Support/raw_ostream.h" 13 14 using namespace llvm; 15 16 MCSectionXCOFF::~MCSectionXCOFF() = default; 17 18 void MCSectionXCOFF::printCsectDirective(raw_ostream &OS) const { 19 OS << "\t.csect " << QualName->getName() << "," << Log2_32(getAlignment()) 20 << '\n'; 21 } 22 23 void MCSectionXCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T, 24 raw_ostream &OS, 25 const MCExpr *Subsection) const { 26 if (getKind().isText()) { 27 if (getMappingClass() != XCOFF::XMC_PR) 28 report_fatal_error("Unhandled storage-mapping class for .text csect"); 29 30 printCsectDirective(OS); 31 return; 32 } 33 34 if (getKind().isReadOnly()) { 35 if (getMappingClass() != XCOFF::XMC_RO) 36 report_fatal_error("Unhandled storage-mapping class for .rodata csect."); 37 printCsectDirective(OS); 38 return; 39 } 40 41 if (getKind().isData()) { 42 switch (getMappingClass()) { 43 case XCOFF::XMC_RW: 44 case XCOFF::XMC_DS: 45 printCsectDirective(OS); 46 break; 47 case XCOFF::XMC_TC: 48 break; 49 case XCOFF::XMC_TC0: 50 OS << "\t.toc\n"; 51 break; 52 default: 53 report_fatal_error( 54 "Unhandled storage-mapping class for .data csect."); 55 } 56 return; 57 } 58 59 if (getKind().isBSSLocal() || getKind().isCommon()) { 60 assert((getMappingClass() == XCOFF::XMC_RW || 61 getMappingClass() == XCOFF::XMC_BS) && 62 "Generated a storage-mapping class for a common/bss csect we don't " 63 "understand how to switch to."); 64 assert(getCSectType() == XCOFF::XTY_CM && 65 "wrong csect type for .bss csect"); 66 // Don't have to print a directive for switching to section for commons. 67 // '.comm' and '.lcomm' directives for the variable will create the needed 68 // csect. 69 return; 70 } 71 72 report_fatal_error("Printing for this SectionKind is unimplemented."); 73 } 74 75 bool MCSectionXCOFF::UseCodeAlign() const { return getKind().isText(); } 76 77 bool MCSectionXCOFF::isVirtualSection() const { return XCOFF::XTY_CM == Type; } 78