1 //=====- NVPTXTargetStreamer.cpp - NVPTXTargetStreamer class ------------=====//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements the NVPTXTargetStreamer class.
11 //===----------------------------------------------------------------------===//
13 #include "NVPTXTargetStreamer.h"
14 #include "llvm/MC/MCAsmInfo.h"
15 #include "llvm/MC/MCContext.h"
16 #include "llvm/MC/MCObjectFileInfo.h"
21 // NVPTXTargetStreamer Implemenation
23 NVPTXTargetStreamer::NVPTXTargetStreamer(MCStreamer
&S
) : MCTargetStreamer(S
) {}
24 NVPTXTargetStreamer::~NVPTXTargetStreamer() = default;
26 NVPTXAsmTargetStreamer::NVPTXAsmTargetStreamer(MCStreamer
&S
)
27 : NVPTXTargetStreamer(S
) {}
28 NVPTXAsmTargetStreamer::~NVPTXAsmTargetStreamer() = default;
30 void NVPTXTargetStreamer::outputDwarfFileDirectives() {
31 for (const std::string
&S
: DwarfFiles
)
32 getStreamer().emitRawText(S
);
36 void NVPTXTargetStreamer::closeLastSection() {
38 getStreamer().emitRawText("\t}");
41 void NVPTXTargetStreamer::emitDwarfFileDirective(StringRef Directive
) {
42 DwarfFiles
.emplace_back(Directive
);
45 static bool isDwarfSection(const MCObjectFileInfo
*FI
,
46 const MCSection
*Section
) {
47 // FIXME: the checks for the DWARF sections are very fragile and should be
48 // fixed up in a followup patch.
49 if (!Section
|| Section
->isText())
51 return Section
== FI
->getDwarfAbbrevSection() ||
52 Section
== FI
->getDwarfInfoSection() ||
53 Section
== FI
->getDwarfMacinfoSection() ||
54 Section
== FI
->getDwarfFrameSection() ||
55 Section
== FI
->getDwarfAddrSection() ||
56 Section
== FI
->getDwarfRangesSection() ||
57 Section
== FI
->getDwarfARangesSection() ||
58 Section
== FI
->getDwarfLocSection() ||
59 Section
== FI
->getDwarfStrSection() ||
60 Section
== FI
->getDwarfLineSection() ||
61 Section
== FI
->getDwarfStrOffSection() ||
62 Section
== FI
->getDwarfLineStrSection() ||
63 Section
== FI
->getDwarfPubNamesSection() ||
64 Section
== FI
->getDwarfPubTypesSection() ||
65 Section
== FI
->getDwarfSwiftASTSection() ||
66 Section
== FI
->getDwarfTypesDWOSection() ||
67 Section
== FI
->getDwarfAbbrevDWOSection() ||
68 Section
== FI
->getDwarfAccelObjCSection() ||
69 Section
== FI
->getDwarfAccelNamesSection() ||
70 Section
== FI
->getDwarfAccelTypesSection() ||
71 Section
== FI
->getDwarfAccelNamespaceSection() ||
72 Section
== FI
->getDwarfLocDWOSection() ||
73 Section
== FI
->getDwarfStrDWOSection() ||
74 Section
== FI
->getDwarfCUIndexSection() ||
75 Section
== FI
->getDwarfInfoDWOSection() ||
76 Section
== FI
->getDwarfLineDWOSection() ||
77 Section
== FI
->getDwarfTUIndexSection() ||
78 Section
== FI
->getDwarfStrOffDWOSection() ||
79 Section
== FI
->getDwarfDebugNamesSection() ||
80 Section
== FI
->getDwarfDebugInlineSection() ||
81 Section
== FI
->getDwarfGnuPubNamesSection() ||
82 Section
== FI
->getDwarfGnuPubTypesSection();
85 void NVPTXTargetStreamer::changeSection(const MCSection
*CurSection
,
86 MCSection
*Section
, uint32_t SubSection
,
88 assert(!SubSection
&& "SubSection is not null!");
89 const MCObjectFileInfo
*FI
= getStreamer().getContext().getObjectFileInfo();
90 // Emit closing brace for DWARF sections only.
91 if (isDwarfSection(FI
, CurSection
))
93 if (isDwarfSection(FI
, Section
)) {
94 // Emit DWARF .file directives in the outermost scope.
95 outputDwarfFileDirectives();
97 Section
->printSwitchToSection(*getStreamer().getContext().getAsmInfo(),
98 getStreamer().getContext().getTargetTriple(),
100 // DWARF sections are enclosed into braces - emit the open one.
106 void NVPTXTargetStreamer::emitRawBytes(StringRef Data
) {
107 MCTargetStreamer::emitRawBytes(Data
);
108 // TODO: enable this once the bug in the ptxas with the packed bytes is
109 // resolved. Currently, (it is confirmed by NVidia) it causes a crash in
112 const MCAsmInfo
*MAI
= Streamer
.getContext().getAsmInfo();
113 const char *Directive
= MAI
->getData8bitsDirective();
114 unsigned NumElements
= Data
.size();
115 const unsigned MaxLen
= 40;
116 unsigned NumChunks
= 1 + ((NumElements
- 1) / MaxLen
);
117 // Split the very long directives into several parts if the limit is
119 for (unsigned I
= 0; I
< NumChunks
; ++I
) {
120 SmallString
<128> Str
;
121 raw_svector_ostream
OS(Str
);
123 const char *Label
= Directive
;
124 for (auto It
= std::next(Data
.bytes_begin(), I
* MaxLen
),
125 End
= (I
== NumChunks
- 1)
127 : std::next(Data
.bytes_begin(), (I
+ 1) * MaxLen
);
129 OS
<< Label
<< (unsigned)*It
;
130 if (Label
== Directive
)
133 Streamer
.emitRawText(OS
.str());