Eric Christopher | 68f2218 | 2018-05-18 03:13:08 +0000 | [diff] [blame] | 1 | //=====- NVPTXTargetStreamer.cpp - NVPTXTargetStreamer class ------------=====// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file implements the NVPTXTargetStreamer class. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "NVPTXTargetStreamer.h" |
| 15 | #include "llvm/MC/MCAsmInfo.h" |
| 16 | #include "llvm/MC/MCContext.h" |
| 17 | #include "llvm/MC/MCObjectFileInfo.h" |
| 18 | |
| 19 | using namespace llvm; |
| 20 | |
| 21 | // |
| 22 | // NVPTXTargetStreamer Implemenation |
| 23 | // |
| 24 | NVPTXTargetStreamer::NVPTXTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} |
| 25 | |
| 26 | NVPTXTargetStreamer::~NVPTXTargetStreamer() = default; |
| 27 | |
Alexey Bataev | 64ad0ad | 2018-12-06 16:02:09 +0000 | [diff] [blame] | 28 | void NVPTXTargetStreamer::outputDwarfFileDirectives() { |
| 29 | for (const std::string &S : DwarfFiles) |
| 30 | getStreamer().EmitRawText(S.data()); |
| 31 | DwarfFiles.clear(); |
| 32 | } |
| 33 | |
Eric Christopher | 68f2218 | 2018-05-18 03:13:08 +0000 | [diff] [blame] | 34 | void NVPTXTargetStreamer::emitDwarfFileDirective(StringRef Directive) { |
| 35 | DwarfFiles.emplace_back(Directive); |
| 36 | } |
| 37 | |
| 38 | static bool isDwarfSection(const MCObjectFileInfo *FI, |
| 39 | const MCSection *Section) { |
| 40 | // FIXME: the checks for the DWARF sections are very fragile and should be |
| 41 | // fixed up in a followup patch. |
| 42 | if (!Section || Section->getKind().isText() || |
| 43 | Section->getKind().isWriteable()) |
| 44 | return false; |
| 45 | return Section == FI->getDwarfAbbrevSection() || |
| 46 | Section == FI->getDwarfInfoSection() || |
| 47 | Section == FI->getDwarfMacinfoSection() || |
| 48 | Section == FI->getDwarfFrameSection() || |
| 49 | Section == FI->getDwarfAddrSection() || |
| 50 | Section == FI->getDwarfRangesSection() || |
| 51 | Section == FI->getDwarfARangesSection() || |
| 52 | Section == FI->getDwarfLocSection() || |
| 53 | Section == FI->getDwarfStrSection() || |
| 54 | Section == FI->getDwarfLineSection() || |
| 55 | Section == FI->getDwarfStrOffSection() || |
| 56 | Section == FI->getDwarfLineStrSection() || |
| 57 | Section == FI->getDwarfPubNamesSection() || |
| 58 | Section == FI->getDwarfPubTypesSection() || |
| 59 | Section == FI->getDwarfSwiftASTSection() || |
| 60 | Section == FI->getDwarfTypesDWOSection() || |
| 61 | Section == FI->getDwarfAbbrevDWOSection() || |
| 62 | Section == FI->getDwarfAccelObjCSection() || |
| 63 | Section == FI->getDwarfAccelNamesSection() || |
| 64 | Section == FI->getDwarfAccelTypesSection() || |
| 65 | Section == FI->getDwarfAccelNamespaceSection() || |
| 66 | Section == FI->getDwarfLocDWOSection() || |
| 67 | Section == FI->getDwarfStrDWOSection() || |
| 68 | Section == FI->getDwarfCUIndexSection() || |
| 69 | Section == FI->getDwarfInfoDWOSection() || |
| 70 | Section == FI->getDwarfLineDWOSection() || |
| 71 | Section == FI->getDwarfTUIndexSection() || |
| 72 | Section == FI->getDwarfStrOffDWOSection() || |
| 73 | Section == FI->getDwarfDebugNamesSection() || |
| 74 | Section == FI->getDwarfDebugInlineSection() || |
| 75 | Section == FI->getDwarfGnuPubNamesSection() || |
| 76 | Section == FI->getDwarfGnuPubTypesSection(); |
| 77 | } |
| 78 | |
| 79 | void NVPTXTargetStreamer::changeSection(const MCSection *CurSection, |
| 80 | MCSection *Section, |
| 81 | const MCExpr *SubSection, |
| 82 | raw_ostream &OS) { |
| 83 | assert(!SubSection && "SubSection is not null!"); |
| 84 | const MCObjectFileInfo *FI = getStreamer().getContext().getObjectFileInfo(); |
| 85 | // FIXME: remove comment once debug info is properly supported. |
| 86 | // Emit closing brace for DWARF sections only. |
| 87 | if (isDwarfSection(FI, CurSection)) |
| 88 | OS << "//\t}\n"; |
| 89 | if (isDwarfSection(FI, Section)) { |
| 90 | // Emit DWARF .file directives in the outermost scope. |
Alexey Bataev | 64ad0ad | 2018-12-06 16:02:09 +0000 | [diff] [blame] | 91 | outputDwarfFileDirectives(); |
Eric Christopher | 68f2218 | 2018-05-18 03:13:08 +0000 | [diff] [blame] | 92 | OS << "//\t.section"; |
| 93 | Section->PrintSwitchToSection(*getStreamer().getContext().getAsmInfo(), |
| 94 | FI->getTargetTriple(), OS, SubSection); |
| 95 | // DWARF sections are enclosed into braces - emit the open one. |
| 96 | OS << "//\t{\n"; |
| 97 | } |
| 98 | } |
Alexey Bataev | c15c853 | 2018-10-24 14:04:00 +0000 | [diff] [blame] | 99 | |
| 100 | void NVPTXTargetStreamer::emitRawBytes(StringRef Data) { |
| 101 | const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo(); |
| 102 | const char *Directive = MAI->getData8bitsDirective(); |
| 103 | unsigned NumElements = Data.size(); |
| 104 | const unsigned MaxLen = 40; |
| 105 | unsigned NumChunks = 1 + ((NumElements - 1) / MaxLen); |
| 106 | // Split the very long directives into several parts if the limit is |
| 107 | // specified. |
| 108 | for (unsigned I = 0; I < NumChunks; ++I) { |
| 109 | SmallString<128> Str; |
| 110 | raw_svector_ostream OS(Str); |
| 111 | |
| 112 | const char *Label = Directive; |
| 113 | for (auto It = std::next(Data.bytes_begin(), I * MaxLen), |
| 114 | End = (I == NumChunks - 1) |
| 115 | ? Data.bytes_end() |
| 116 | : std::next(Data.bytes_begin(), (I + 1) * MaxLen); |
| 117 | It != End; ++It) { |
| 118 | OS << Label << (unsigned)*It; |
| 119 | if (Label == Directive) |
| 120 | Label = ","; |
| 121 | } |
| 122 | Streamer.EmitRawText(OS.str()); |
| 123 | } |
| 124 | } |
| 125 | |