Files
clang-p2996/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp
Eric Christopher 68f2218e1e Revert "Temporarily revert "[DEBUG] Initial adaptation of NVPTX target for debug info emission.""
This reapplies commits: r330271, r330592, r330779.

    [DEBUG] Initial adaptation of NVPTX target for debug info emission.

    Summary:
    Patch adds initial emission of the debug info for NVPTX target.
    Currently, only .file and .loc directives are emitted, everything else is
    commented out to not break the compilation of Cuda.

llvm-svn: 332689
2018-05-18 03:13:08 +00:00

95 lines
3.9 KiB
C++

//=====- NVPTXTargetStreamer.cpp - NVPTXTargetStreamer class ------------=====//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the NVPTXTargetStreamer class.
//
//===----------------------------------------------------------------------===//
#include "NVPTXTargetStreamer.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCObjectFileInfo.h"
using namespace llvm;
//
// NVPTXTargetStreamer Implemenation
//
NVPTXTargetStreamer::NVPTXTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
NVPTXTargetStreamer::~NVPTXTargetStreamer() = default;
void NVPTXTargetStreamer::emitDwarfFileDirective(StringRef Directive) {
DwarfFiles.emplace_back(Directive);
}
static bool isDwarfSection(const MCObjectFileInfo *FI,
const MCSection *Section) {
// FIXME: the checks for the DWARF sections are very fragile and should be
// fixed up in a followup patch.
if (!Section || Section->getKind().isText() ||
Section->getKind().isWriteable())
return false;
return Section == FI->getDwarfAbbrevSection() ||
Section == FI->getDwarfInfoSection() ||
Section == FI->getDwarfMacinfoSection() ||
Section == FI->getDwarfFrameSection() ||
Section == FI->getDwarfAddrSection() ||
Section == FI->getDwarfRangesSection() ||
Section == FI->getDwarfARangesSection() ||
Section == FI->getDwarfLocSection() ||
Section == FI->getDwarfStrSection() ||
Section == FI->getDwarfLineSection() ||
Section == FI->getDwarfStrOffSection() ||
Section == FI->getDwarfLineStrSection() ||
Section == FI->getDwarfPubNamesSection() ||
Section == FI->getDwarfPubTypesSection() ||
Section == FI->getDwarfSwiftASTSection() ||
Section == FI->getDwarfTypesDWOSection() ||
Section == FI->getDwarfAbbrevDWOSection() ||
Section == FI->getDwarfAccelObjCSection() ||
Section == FI->getDwarfAccelNamesSection() ||
Section == FI->getDwarfAccelTypesSection() ||
Section == FI->getDwarfAccelNamespaceSection() ||
Section == FI->getDwarfLocDWOSection() ||
Section == FI->getDwarfStrDWOSection() ||
Section == FI->getDwarfCUIndexSection() ||
Section == FI->getDwarfInfoDWOSection() ||
Section == FI->getDwarfLineDWOSection() ||
Section == FI->getDwarfTUIndexSection() ||
Section == FI->getDwarfStrOffDWOSection() ||
Section == FI->getDwarfDebugNamesSection() ||
Section == FI->getDwarfDebugInlineSection() ||
Section == FI->getDwarfGnuPubNamesSection() ||
Section == FI->getDwarfGnuPubTypesSection();
}
void NVPTXTargetStreamer::changeSection(const MCSection *CurSection,
MCSection *Section,
const MCExpr *SubSection,
raw_ostream &OS) {
assert(!SubSection && "SubSection is not null!");
const MCObjectFileInfo *FI = getStreamer().getContext().getObjectFileInfo();
// FIXME: remove comment once debug info is properly supported.
// Emit closing brace for DWARF sections only.
if (isDwarfSection(FI, CurSection))
OS << "//\t}\n";
if (isDwarfSection(FI, Section)) {
// Emit DWARF .file directives in the outermost scope.
for (const std::string &S : DwarfFiles)
getStreamer().EmitRawText(S.data());
DwarfFiles.clear();
OS << "//\t.section";
Section->PrintSwitchToSection(*getStreamer().getContext().getAsmInfo(),
FI->getTargetTriple(), OS, SubSection);
// DWARF sections are enclosed into braces - emit the open one.
OS << "//\t{\n";
}
}