//=====- NVPTXTargetStreamer.cpp - NVPTXTargetStreamer class ------------=====// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements the NVPTXTargetStreamer class. // //===----------------------------------------------------------------------===// #include "NVPTXTargetStreamer.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCObjectFileInfo.h" using namespace llvm; // // NVPTXTargetStreamer Implemenation // NVPTXTargetStreamer::NVPTXTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} NVPTXTargetStreamer::~NVPTXTargetStreamer() = default; void NVPTXTargetStreamer::emitDwarfFileDirective(StringRef Directive) { DwarfFiles.emplace_back(Directive); } static bool isDwarfSection(const MCObjectFileInfo *FI, const MCSection *Section) { // FIXME: the checks for the DWARF sections are very fragile and should be // fixed up in a followup patch. if (!Section || Section->getKind().isText() || Section->getKind().isWriteable()) return false; return Section == FI->getDwarfAbbrevSection() || Section == FI->getDwarfInfoSection() || Section == FI->getDwarfMacinfoSection() || Section == FI->getDwarfFrameSection() || Section == FI->getDwarfAddrSection() || Section == FI->getDwarfRangesSection() || Section == FI->getDwarfARangesSection() || Section == FI->getDwarfLocSection() || Section == FI->getDwarfStrSection() || Section == FI->getDwarfLineSection() || Section == FI->getDwarfStrOffSection() || Section == FI->getDwarfLineStrSection() || Section == FI->getDwarfPubNamesSection() || Section == FI->getDwarfPubTypesSection() || Section == FI->getDwarfSwiftASTSection() || Section == FI->getDwarfTypesDWOSection() || Section == FI->getDwarfAbbrevDWOSection() || Section == FI->getDwarfAccelObjCSection() || Section == FI->getDwarfAccelNamesSection() || Section == FI->getDwarfAccelTypesSection() || Section == FI->getDwarfAccelNamespaceSection() || Section == FI->getDwarfLocDWOSection() || Section == FI->getDwarfStrDWOSection() || Section == FI->getDwarfCUIndexSection() || Section == FI->getDwarfInfoDWOSection() || Section == FI->getDwarfLineDWOSection() || Section == FI->getDwarfTUIndexSection() || Section == FI->getDwarfStrOffDWOSection() || Section == FI->getDwarfDebugNamesSection() || Section == FI->getDwarfDebugInlineSection() || Section == FI->getDwarfGnuPubNamesSection() || Section == FI->getDwarfGnuPubTypesSection(); } void NVPTXTargetStreamer::changeSection(const MCSection *CurSection, MCSection *Section, const MCExpr *SubSection, raw_ostream &OS) { assert(!SubSection && "SubSection is not null!"); const MCObjectFileInfo *FI = getStreamer().getContext().getObjectFileInfo(); // FIXME: remove comment once debug info is properly supported. // Emit closing brace for DWARF sections only. if (isDwarfSection(FI, CurSection)) OS << "//\t}\n"; if (isDwarfSection(FI, Section)) { // Emit DWARF .file directives in the outermost scope. for (const std::string &S : DwarfFiles) getStreamer().EmitRawText(S.data()); DwarfFiles.clear(); OS << "//\t.section"; Section->PrintSwitchToSection(*getStreamer().getContext().getAsmInfo(), FI->getTargetTriple(), OS, SubSection); // DWARF sections are enclosed into braces - emit the open one. OS << "//\t{\n"; } }