LLVM  17.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 
18 using 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 
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->getKind().isText() ||
50  Section->getKind().isWriteable())
51  return false;
52  return Section == FI->getDwarfAbbrevSection() ||
53  Section == FI->getDwarfInfoSection() ||
54  Section == FI->getDwarfMacinfoSection() ||
55  Section == FI->getDwarfFrameSection() ||
56  Section == FI->getDwarfAddrSection() ||
57  Section == FI->getDwarfRangesSection() ||
58  Section == FI->getDwarfARangesSection() ||
59  Section == FI->getDwarfLocSection() ||
60  Section == FI->getDwarfStrSection() ||
61  Section == FI->getDwarfLineSection() ||
62  Section == FI->getDwarfStrOffSection() ||
63  Section == FI->getDwarfLineStrSection() ||
64  Section == FI->getDwarfPubNamesSection() ||
65  Section == FI->getDwarfPubTypesSection() ||
66  Section == FI->getDwarfSwiftASTSection() ||
67  Section == FI->getDwarfTypesDWOSection() ||
68  Section == FI->getDwarfAbbrevDWOSection() ||
69  Section == FI->getDwarfAccelObjCSection() ||
70  Section == FI->getDwarfAccelNamesSection() ||
71  Section == FI->getDwarfAccelTypesSection() ||
72  Section == FI->getDwarfAccelNamespaceSection() ||
73  Section == FI->getDwarfLocDWOSection() ||
74  Section == FI->getDwarfStrDWOSection() ||
75  Section == FI->getDwarfCUIndexSection() ||
76  Section == FI->getDwarfInfoDWOSection() ||
77  Section == FI->getDwarfLineDWOSection() ||
78  Section == FI->getDwarfTUIndexSection() ||
79  Section == FI->getDwarfStrOffDWOSection() ||
80  Section == FI->getDwarfDebugNamesSection() ||
81  Section == FI->getDwarfDebugInlineSection() ||
82  Section == FI->getDwarfGnuPubNamesSection() ||
83  Section == FI->getDwarfGnuPubTypesSection();
84 }
85 
87  MCSection *Section,
88  const MCExpr *SubSection,
89  raw_ostream &OS) {
90  assert(!SubSection && "SubSection is not null!");
92  // Emit closing brace for DWARF sections only.
93  if (isDwarfSection(FI, CurSection))
94  OS << "\t}\n";
95  if (isDwarfSection(FI, Section)) {
96  // Emit DWARF .file directives in the outermost scope.
98  OS << "\t.section";
99  Section->printSwitchToSection(*getStreamer().getContext().getAsmInfo(),
100  getStreamer().getContext().getTargetTriple(),
101  OS, SubSection);
102  // DWARF sections are enclosed into braces - emit the open one.
103  OS << "\t{\n";
104  HasSections = true;
105  }
106 }
107 
110  // TODO: enable this once the bug in the ptxas with the packed bytes is
111  // resolved. Currently, (it is confirmed by NVidia) it causes a crash in
112  // ptxas.
113 #if 0
114  const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
115  const char *Directive = MAI->getData8bitsDirective();
116  unsigned NumElements = Data.size();
117  const unsigned MaxLen = 40;
118  unsigned NumChunks = 1 + ((NumElements - 1) / MaxLen);
119  // Split the very long directives into several parts if the limit is
120  // specified.
121  for (unsigned I = 0; I < NumChunks; ++I) {
122  SmallString<128> Str;
123  raw_svector_ostream OS(Str);
124 
125  const char *Label = Directive;
126  for (auto It = std::next(Data.bytes_begin(), I * MaxLen),
127  End = (I == NumChunks - 1)
128  ? Data.bytes_end()
129  : std::next(Data.bytes_begin(), (I + 1) * MaxLen);
130  It != End; ++It) {
131  OS << Label << (unsigned)*It;
132  if (Label == Directive)
133  Label = ",";
134  }
135  Streamer.emitRawText(OS.str());
136  }
137 #endif
138 }
139 
llvm::MCTargetStreamer::getStreamer
MCStreamer & getStreamer()
Definition: MCStreamer.h:101
llvm::MCObjectFileInfo::getDwarfRangesSection
MCSection * getDwarfRangesSection() const
Definition: MCObjectFileInfo.h:291
llvm::NVPTXTargetStreamer::NVPTXTargetStreamer
NVPTXTargetStreamer(MCStreamer &S)
Definition: NVPTXTargetStreamer.cpp:23
llvm::MCObjectFileInfo::getDwarfAddrSection
MCSection * getDwarfAddrSection() const
Definition: MCObjectFileInfo.h:321
llvm::MCContext::getObjectFileInfo
const MCObjectFileInfo * getObjectFileInfo() const
Definition: MCContext.h:450
llvm::MCObjectFileInfo::getDwarfAccelObjCSection
MCSection * getDwarfAccelObjCSection() const
Definition: MCObjectFileInfo.h:303
llvm::MCObjectFileInfo::getDwarfFrameSection
MCSection * getDwarfFrameSection() const
Definition: MCObjectFileInfo.h:276
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::NVPTXTargetStreamer::outputDwarfFileDirectives
void outputDwarfFileDirectives()
Outputs the list of the DWARF '.file' directives to the streamer.
Definition: NVPTXTargetStreamer.cpp:30
llvm::NVPTXAsmTargetStreamer::~NVPTXAsmTargetStreamer
~NVPTXAsmTargetStreamer() override
llvm::MCObjectFileInfo::getDwarfPubTypesSection
MCSection * getDwarfPubTypesSection() const
Definition: MCObjectFileInfo.h:278
llvm::MCTargetStreamer::emitRawBytes
virtual void emitRawBytes(StringRef Data)
Emit the bytes in Data into the output.
Definition: MCStreamer.cpp:80
llvm::MCAsmInfo
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
llvm::MCObjectFileInfo::getDwarfCUIndexSection
MCSection * getDwarfCUIndexSection() const
Definition: MCObjectFileInfo.h:332
MCObjectFileInfo.h
llvm::MCObjectFileInfo::getDwarfLocSection
MCSection * getDwarfLocSection() const
Definition: MCObjectFileInfo.h:289
llvm::MCObjectFileInfo::getDwarfStrOffSection
MCSection * getDwarfStrOffSection() const
Definition: MCObjectFileInfo.h:320
NVPTXTargetStreamer.h
llvm::MCObjectFileInfo::getDwarfGnuPubTypesSection
MCSection * getDwarfGnuPubTypesSection() const
Definition: MCObjectFileInfo.h:282
llvm::Data
@ Data
Definition: SIMachineScheduler.h:55
llvm::MCObjectFileInfo::getDwarfInfoSection
MCSection * getDwarfInfoSection() const
Definition: MCObjectFileInfo.h:270
llvm::MCObjectFileInfo::getDwarfPubNamesSection
MCSection * getDwarfPubNamesSection() const
Definition: MCObjectFileInfo.h:277
llvm::MCStreamer
Streaming machine code generation interface.
Definition: MCStreamer.h:212
llvm::MCObjectFileInfo::getDwarfARangesSection
MCSection * getDwarfARangesSection() const
Definition: MCObjectFileInfo.h:290
MCContext.h
llvm::MCObjectFileInfo::getDwarfMacinfoSection
MCSection * getDwarfMacinfoSection() const
Definition: MCObjectFileInfo.h:294
llvm::MCObjectFileInfo::getDwarfInfoDWOSection
MCSection * getDwarfInfoDWOSection() const
Definition: MCObjectFileInfo.h:310
llvm::MCObjectFileInfo::getDwarfLocDWOSection
MCSection * getDwarfLocDWOSection() const
Definition: MCObjectFileInfo.h:318
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
llvm::MCTargetStreamer
Target specific streamer interface.
Definition: MCStreamer.h:93
llvm::MCObjectFileInfo::getDwarfStrDWOSection
MCSection * getDwarfStrDWOSection() const
Definition: MCObjectFileInfo.h:316
llvm::MCObjectFileInfo::getDwarfAccelNamespaceSection
MCSection * getDwarfAccelNamespaceSection() const
Definition: MCObjectFileInfo.h:304
llvm::MCAsmInfo::getData8bitsDirective
const char * getData8bitsDirective() const
Definition: MCAsmInfo.h:568
llvm::SmallString< 128 >
llvm::NVPTXTargetStreamer::~NVPTXTargetStreamer
~NVPTXTargetStreamer() override
llvm::MCObjectFileInfo::getDwarfSwiftASTSection
MCSection * getDwarfSwiftASTSection() const
Definition: MCObjectFileInfo.h:334
llvm::MCContext::getAsmInfo
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:446
llvm::MCObjectFileInfo::getDwarfDebugNamesSection
MCSection * getDwarfDebugNamesSection() const
Definition: MCObjectFileInfo.h:297
llvm::MCTargetStreamer::Streamer
MCStreamer & Streamer
Definition: MCStreamer.h:95
llvm::MCStreamer::emitRawText
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:993
llvm::MCObjectFileInfo::getDwarfAccelNamesSection
MCSection * getDwarfAccelNamesSection() const
Definition: MCObjectFileInfo.h:300
I
#define I(x, y, z)
Definition: MD5.cpp:58
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::NVPTXTargetStreamer::closeLastSection
void closeLastSection()
Close last section.
Definition: NVPTXTargetStreamer.cpp:36
MCAsmInfo.h
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
llvm::raw_svector_ostream::str
StringRef str() const
Return a StringRef for the vector contents.
Definition: raw_ostream.h:697
llvm::MCSection
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:39
S
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
Definition: README.txt:210
llvm::MCObjectFileInfo::getDwarfTUIndexSection
MCSection * getDwarfTUIndexSection() const
Definition: MCObjectFileInfo.h:333
llvm::NVPTXTargetStreamer
Implments NVPTX-specific streamer.
Definition: NVPTXTargetStreamer.h:18
llvm::MCObjectFileInfo::getDwarfTypesDWOSection
MCSection * getDwarfTypesDWOSection() const
Definition: MCObjectFileInfo.h:314
llvm::MCObjectFileInfo::getDwarfLineDWOSection
MCSection * getDwarfLineDWOSection() const
Definition: MCObjectFileInfo.h:317
llvm::MCObjectFileInfo::getDwarfAbbrevSection
MCSection * getDwarfAbbrevSection() const
Definition: MCObjectFileInfo.h:269
llvm::MCObjectFileInfo::getDwarfLineStrSection
MCSection * getDwarfLineStrSection() const
Definition: MCObjectFileInfo.h:275
llvm::MCStreamer::getContext
MCContext & getContext() const
Definition: MCStreamer.h:293
llvm::MCObjectFileInfo::getDwarfAbbrevDWOSection
MCSection * getDwarfAbbrevDWOSection() const
Definition: MCObjectFileInfo.h:315
llvm::MCObjectFileInfo::getDwarfDebugInlineSection
const MCSection * getDwarfDebugInlineSection() const
Definition: MCObjectFileInfo.h:285
llvm::NVPTXAsmTargetStreamer::NVPTXAsmTargetStreamer
NVPTXAsmTargetStreamer(MCStreamer &S)
Definition: NVPTXTargetStreamer.cpp:26
llvm::MCObjectFileInfo::getDwarfStrSection
MCSection * getDwarfStrSection() const
Definition: MCObjectFileInfo.h:288
llvm::NVPTXTargetStreamer::changeSection
void changeSection(const MCSection *CurSection, MCSection *Section, const MCExpr *SubSection, raw_ostream &OS) override
Update streamer for a new active section.
Definition: NVPTXTargetStreamer.cpp:86
llvm::raw_svector_ostream
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:672
llvm::MCObjectFileInfo::getDwarfAccelTypesSection
MCSection * getDwarfAccelTypesSection() const
Definition: MCObjectFileInfo.h:307
isDwarfSection
static bool isDwarfSection(const MCObjectFileInfo *FI, const MCSection *Section)
Definition: NVPTXTargetStreamer.cpp:45
llvm::NVPTXTargetStreamer::emitDwarfFileDirective
void emitDwarfFileDirective(StringRef Directive) override
Record DWARF file directives for later output.
Definition: NVPTXTargetStreamer.cpp:41
llvm::MCObjectFileInfo::getDwarfLineSection
MCSection * getDwarfLineSection() const
Definition: MCObjectFileInfo.h:274
llvm::Directive
Definition: DirectiveEmitter.h:100
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
llvm::NVPTXTargetStreamer::emitRawBytes
void emitRawBytes(StringRef Data) override
Emit the bytes in Data into the output.
Definition: NVPTXTargetStreamer.cpp:108
llvm::MCObjectFileInfo::getDwarfStrOffDWOSection
MCSection * getDwarfStrOffDWOSection() const
Definition: MCObjectFileInfo.h:319
llvm::MCObjectFileInfo
Definition: MCObjectFileInfo.h:28
llvm::MCObjectFileInfo::getDwarfGnuPubNamesSection
MCSection * getDwarfGnuPubNamesSection() const
Definition: MCObjectFileInfo.h:279
llvm::SmallVectorImpl::emplace_back
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:941