]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / NVPTX / MCTargetDesc / NVPTXTargetStreamer.cpp
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
28 void NVPTXTargetStreamer::outputDwarfFileDirectives() {
29   for (const std::string &S : DwarfFiles)
30     getStreamer().EmitRawText(S.data());
31   DwarfFiles.clear();
32 }
33
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.
91     outputDwarfFileDirectives();
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 }
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