diff options
Diffstat (limited to 'llvm/lib/Target/NVPTX')
-rw-r--r-- | llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h | 4 |
2 files changed, 31 insertions, 0 deletions
diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp index aeb90eca3a0..71ca7a5ca8d 100644 --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp @@ -92,3 +92,30 @@ void NVPTXTargetStreamer::changeSection(const MCSection *CurSection, OS << "//\t{\n"; } } + +void NVPTXTargetStreamer::emitRawBytes(StringRef Data) { + const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo(); + const char *Directive = MAI->getData8bitsDirective(); + unsigned NumElements = Data.size(); + const unsigned MaxLen = 40; + unsigned NumChunks = 1 + ((NumElements - 1) / MaxLen); + // Split the very long directives into several parts if the limit is + // specified. + for (unsigned I = 0; I < NumChunks; ++I) { + SmallString<128> Str; + raw_svector_ostream OS(Str); + + const char *Label = Directive; + for (auto It = std::next(Data.bytes_begin(), I * MaxLen), + End = (I == NumChunks - 1) + ? Data.bytes_end() + : std::next(Data.bytes_begin(), (I + 1) * MaxLen); + It != End; ++It) { + OS << Label << (unsigned)*It; + if (Label == Directive) + Label = ","; + } + Streamer.EmitRawText(OS.str()); + } +} + diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h index 30831ab8bbe..34391a8b9ab 100644 --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h @@ -39,6 +39,10 @@ public: void emitDwarfFileDirective(StringRef Directive) override; void changeSection(const MCSection *CurSection, MCSection *Section, const MCExpr *SubSection, raw_ostream &OS) override; + /// Emit the bytes in \p Data into the output. + /// + /// This is used to emit bytes in \p Data as sequence of .byte directives. + void emitRawBytes(StringRef Data) override; }; } // end namespace llvm |