forked from OSchip/llvm-project
95 lines
3.9 KiB
C++
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";
|
|
}
|
|
}
|