forked from OSchip/llvm-project
[NVPTX] Initial adaptation of MCAsmStreamer/MCTargetStreamer for debug info in Cuda.
Summary: Initial changes in interfaces of MCAsmStreamer/MCTargetStreamer for correct debug info emission for Cuda. 1. PTX foramt does not support `.ascii` directives. Added the ability to nullify it. 2. The initial function label must follow the first debug `.loc` directive, not be followed by. 3. DWARF sections must be enclosed in braces. Reviewers: hfinkel, probinson, jlebar, rafael, echristo Subscribers: sdardis, nemanjai, llvm-commits, aprantl Differential Revision: https://reviews.llvm.org/D40033 llvm-svn: 321178
This commit is contained in:
parent
8f6b0c850a
commit
88fb980a7c
|
@ -165,7 +165,8 @@ protected:
|
||||||
const char *ZeroDirective;
|
const char *ZeroDirective;
|
||||||
|
|
||||||
/// This directive allows emission of an ascii string with the standard C
|
/// This directive allows emission of an ascii string with the standard C
|
||||||
/// escape characters embedded into it. Defaults to "\t.ascii\t"
|
/// escape characters embedded into it. If a target doesn't support this, it
|
||||||
|
/// can be set to null. Defaults to "\t.ascii\t"
|
||||||
const char *AsciiDirective;
|
const char *AsciiDirective;
|
||||||
|
|
||||||
/// If not null, this allows for special handling of zero terminated strings
|
/// If not null, this allows for special handling of zero terminated strings
|
||||||
|
|
|
@ -95,6 +95,17 @@ public:
|
||||||
virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS,
|
virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS,
|
||||||
const MCInst &Inst, const MCSubtargetInfo &STI);
|
const MCInst &Inst, const MCSubtargetInfo &STI);
|
||||||
|
|
||||||
|
virtual void emitDwarfFileDirective(StringRef Directive);
|
||||||
|
|
||||||
|
/// Update streamer for a new active section.
|
||||||
|
///
|
||||||
|
/// This is called by PopSection and SwitchSection, if the current
|
||||||
|
/// section changes.
|
||||||
|
virtual void changeSection(const MCSection *CurSection, MCSection *Section,
|
||||||
|
const MCExpr *SubSection, raw_ostream &OS);
|
||||||
|
|
||||||
|
virtual void emitValue(const MCExpr *Value);
|
||||||
|
|
||||||
virtual void finish();
|
virtual void finish();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -405,9 +405,13 @@ void MCAsmStreamer::emitExplicitComments() {
|
||||||
void MCAsmStreamer::ChangeSection(MCSection *Section,
|
void MCAsmStreamer::ChangeSection(MCSection *Section,
|
||||||
const MCExpr *Subsection) {
|
const MCExpr *Subsection) {
|
||||||
assert(Section && "Cannot switch to a null section!");
|
assert(Section && "Cannot switch to a null section!");
|
||||||
Section->PrintSwitchToSection(
|
if (MCTargetStreamer *TS = getTargetStreamer()) {
|
||||||
*MAI, getContext().getObjectFileInfo()->getTargetTriple(), OS,
|
TS->changeSection(getCurrentSectionOnly(), Section, Subsection, OS);
|
||||||
Subsection);
|
} else {
|
||||||
|
Section->PrintSwitchToSection(
|
||||||
|
*MAI, getContext().getObjectFileInfo()->getTargetTriple(), OS,
|
||||||
|
Subsection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCAsmStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) {
|
void MCAsmStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) {
|
||||||
|
@ -796,10 +800,15 @@ void MCAsmStreamer::EmitBytes(StringRef Data) {
|
||||||
"Cannot emit contents before setting section!");
|
"Cannot emit contents before setting section!");
|
||||||
if (Data.empty()) return;
|
if (Data.empty()) return;
|
||||||
|
|
||||||
if (Data.size() == 1) {
|
// If only single byte is provided or no ascii or asciz directives is
|
||||||
OS << MAI->getData8bitsDirective();
|
// supported, emit as vector of 8bits data.
|
||||||
OS << (unsigned)(unsigned char)Data[0];
|
if (Data.size() == 1 ||
|
||||||
EmitEOL();
|
!(MAI->getAscizDirective() || MAI->getAsciiDirective())) {
|
||||||
|
const char *Directive = MAI->getData8bitsDirective();
|
||||||
|
for (const unsigned char C : Data.bytes()) {
|
||||||
|
OS << Directive << (unsigned)C;
|
||||||
|
EmitEOL();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -884,8 +893,12 @@ void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
|
||||||
|
|
||||||
assert(Directive && "Invalid size for machine code value!");
|
assert(Directive && "Invalid size for machine code value!");
|
||||||
OS << Directive;
|
OS << Directive;
|
||||||
Value->print(OS, MAI);
|
if (MCTargetStreamer *TS = getTargetStreamer()) {
|
||||||
EmitEOL();
|
TS->emitValue(Value);
|
||||||
|
} else {
|
||||||
|
Value->print(OS, MAI);
|
||||||
|
EmitEOL();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCAsmStreamer::EmitULEB128Value(const MCExpr *Value) {
|
void MCAsmStreamer::EmitULEB128Value(const MCExpr *Value) {
|
||||||
|
@ -1097,13 +1110,19 @@ unsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OS << "\t.file\t" << FileNo << ' ';
|
SmallString<128> Str;
|
||||||
|
raw_svector_ostream OS1(Str);
|
||||||
|
OS1 << "\t.file\t" << FileNo << ' ';
|
||||||
if (!Directory.empty()) {
|
if (!Directory.empty()) {
|
||||||
PrintQuotedString(Directory, OS);
|
PrintQuotedString(Directory, OS1);
|
||||||
OS << ' ';
|
OS1 << ' ';
|
||||||
|
}
|
||||||
|
PrintQuotedString(Filename, OS1);
|
||||||
|
if (MCTargetStreamer *TS = getTargetStreamer()) {
|
||||||
|
TS->emitDwarfFileDirective(OS1.str());
|
||||||
|
} else {
|
||||||
|
EmitRawText(OS1.str());
|
||||||
}
|
}
|
||||||
PrintQuotedString(Filename, OS);
|
|
||||||
EmitEOL();
|
|
||||||
|
|
||||||
return FileNo;
|
return FileNo;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,28 @@ void MCTargetStreamer::emitLabel(MCSymbol *Symbol) {}
|
||||||
|
|
||||||
void MCTargetStreamer::finish() {}
|
void MCTargetStreamer::finish() {}
|
||||||
|
|
||||||
|
void MCTargetStreamer::changeSection(const MCSection *CurSection,
|
||||||
|
MCSection *Section,
|
||||||
|
const MCExpr *Subsection,
|
||||||
|
raw_ostream &OS) {
|
||||||
|
Section->PrintSwitchToSection(
|
||||||
|
*Streamer.getContext().getAsmInfo(),
|
||||||
|
Streamer.getContext().getObjectFileInfo()->getTargetTriple(), OS,
|
||||||
|
Subsection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCTargetStreamer::emitDwarfFileDirective(StringRef Directive) {
|
||||||
|
Streamer.EmitRawText(Directive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCTargetStreamer::emitValue(const MCExpr *Value) {
|
||||||
|
SmallString<128> Str;
|
||||||
|
raw_svector_ostream OS(Str);
|
||||||
|
|
||||||
|
Value->print(OS, Streamer.getContext().getAsmInfo());
|
||||||
|
Streamer.EmitRawText(OS.str());
|
||||||
|
}
|
||||||
|
|
||||||
void MCTargetStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
|
void MCTargetStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
|
||||||
|
|
||||||
MCStreamer::MCStreamer(MCContext &Ctx)
|
MCStreamer::MCStreamer(MCContext &Ctx)
|
||||||
|
|
Loading…
Reference in New Issue