LLVM 19.0.0git
NVPTXTargetStreamer.cpp
Go to the documentation of this file.
1//=====- NVPTXTargetStreamer.cpp - NVPTXTargetStreamer class ------------=====//
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// This file implements the NVPTXTargetStreamer class.
10//
11//===----------------------------------------------------------------------===//
12
13#include "NVPTXTargetStreamer.h"
14#include "llvm/MC/MCAsmInfo.h"
15#include "llvm/MC/MCContext.h"
17
18using namespace llvm;
19
20//
21// NVPTXTargetStreamer Implemenation
22//
25
29
31 for (const std::string &S : DwarfFiles)
33 DwarfFiles.clear();
34}
35
37 if (HasSections)
38 getStreamer().emitRawText("\t}");
39}
40
42 DwarfFiles.emplace_back(Directive);
43}
44
45static 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())
50 return false;
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();
83}
84
86 MCSection *Section, uint32_t SubSection,
87 raw_ostream &OS) {
88 assert(!SubSection && "SubSection is not null!");
90 // Emit closing brace for DWARF sections only.
91 if (isDwarfSection(FI, CurSection))
92 OS << "\t}\n";
93 if (isDwarfSection(FI, Section)) {
94 // Emit DWARF .file directives in the outermost scope.
96 OS << "\t.section";
97 Section->printSwitchToSection(*getStreamer().getContext().getAsmInfo(),
98 getStreamer().getContext().getTargetTriple(),
99 OS, SubSection);
100 // DWARF sections are enclosed into braces - emit the open one.
101 OS << "\t{\n";
102 HasSections = true;
103 }
104}
105
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
110 // ptxas.
111#if 0
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
118 // specified.
119 for (unsigned I = 0; I < NumChunks; ++I) {
122
123 const char *Label = Directive;
124 for (auto It = std::next(Data.bytes_begin(), I * MaxLen),
125 End = (I == NumChunks - 1)
126 ? Data.bytes_end()
127 : std::next(Data.bytes_begin(), (I + 1) * MaxLen);
128 It != End; ++It) {
129 OS << Label << (unsigned)*It;
130 if (Label == Directive)
131 Label = ",";
132 }
133 Streamer.emitRawText(OS.str());
134 }
135#endif
136}
137
bool End
Definition: ELF_riscv.cpp:480
#define I(x, y, z)
Definition: MD5.cpp:58
static bool isDwarfSection(const MCObjectFileInfo *FI, const MCSection *Section)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
const char * getData8bitsDirective() const
Definition: MCAsmInfo.h:564
const MCObjectFileInfo * getObjectFileInfo() const
Definition: MCContext.h:416
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:412
MCSection * getDwarfAccelTypesSection() const
MCSection * getDwarfGnuPubNamesSection() const
MCSection * getDwarfStrOffDWOSection() const
MCSection * getDwarfRangesSection() const
MCSection * getDwarfAccelNamespaceSection() const
MCSection * getDwarfLineDWOSection() const
MCSection * getDwarfStrOffSection() const
MCSection * getDwarfInfoDWOSection() const
MCSection * getDwarfTypesDWOSection() const
MCSection * getDwarfPubNamesSection() const
MCSection * getDwarfStrSection() const
MCSection * getDwarfLineStrSection() const
MCSection * getDwarfTUIndexSection() const
MCSection * getDwarfDebugNamesSection() const
MCSection * getDwarfAddrSection() const
MCSection * getDwarfLineSection() const
MCSection * getDwarfInfoSection() const
MCSection * getDwarfFrameSection() const
MCSection * getDwarfPubTypesSection() const
const MCSection * getDwarfDebugInlineSection() const
MCSection * getDwarfGnuPubTypesSection() const
MCSection * getDwarfStrDWOSection() const
MCSection * getDwarfAccelNamesSection() const
MCSection * getDwarfAbbrevDWOSection() const
MCSection * getDwarfAbbrevSection() const
MCSection * getDwarfSwiftASTSection() const
MCSection * getDwarfCUIndexSection() const
MCSection * getDwarfMacinfoSection() const
MCSection * getDwarfLocDWOSection() const
MCSection * getDwarfARangesSection() const
MCSection * getDwarfAccelObjCSection() const
MCSection * getDwarfLocSection() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:36
Streaming machine code generation interface.
Definition: MCStreamer.h:213
MCContext & getContext() const
Definition: MCStreamer.h:300
void emitRawText(const Twine &String)
If this file is backed by a assembly streamer, this dumps the specified string in the output ....
Definition: MCStreamer.cpp:991
Target specific streamer interface.
Definition: MCStreamer.h:94
MCStreamer & getStreamer()
Definition: MCStreamer.h:102
virtual void emitRawBytes(StringRef Data)
Emit the bytes in Data into the output.
Definition: MCStreamer.cpp:79
MCStreamer & Streamer
Definition: MCStreamer.h:96
Implments NVPTX-specific streamer.
void emitDwarfFileDirective(StringRef Directive) override
Record DWARF file directives for later output.
void outputDwarfFileDirectives()
Outputs the list of the DWARF '.file' directives to the streamer.
void emitRawBytes(StringRef Data) override
Emit the bytes in Data into the output.
void changeSection(const MCSection *CurSection, MCSection *Section, uint32_t SubSection, raw_ostream &OS) override
Update streamer for a new active section.
void closeLastSection()
Close last section.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:691
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18