Get rid of the .text directive in the assembly output by creating a target object file class specific for the 65816.

This commit is contained in:
Jeremy Rand 2016-05-12 20:13:51 -04:00
parent 30e52d00c8
commit acc21bea81
3 changed files with 163 additions and 1 deletions

View File

@ -16,6 +16,7 @@
#include "WDC65816MachineFunctionInfo.h"
#include "WDC65816RegisterInfo.h"
#include "WDC65816TargetMachine.h"
#include "WDC65816TargetObjectFile.h"
#include "MCTargetDesc/WDC65816BaseInfo.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
@ -808,7 +809,7 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) {
#endif
WDC65816TargetLowering::WDC65816TargetLowering(TargetMachine &TM)
: TargetLowering(TM, new TargetLoweringObjectFileELF()) {
: TargetLowering(TM, new WDC65816TargetObjectFile()) {
addRegisterClass(MVT::i16, &WDC::AccRegsRegClass);
addRegisterClass(MVT::i16, &WDC::IndexXRegsRegClass);
@ -2339,3 +2340,31 @@ void WDC65816TargetLowering::ReplaceNodeResults(SDNode *N,
}
#endif
// Pin WDC65816Section's and WDC65816TargetObjectFile's vtables to this file.
void WDC65816Section::anchor() {}
WDC65816TargetObjectFile::~WDC65816TargetObjectFile() {
delete TextSection;
delete DataSection;
delete BSSSection;
delete ReadOnlySection;
delete StaticCtorSection;
delete StaticDtorSection;
delete LSDASection;
delete EHFrameSection;
delete DwarfAbbrevSection;
delete DwarfInfoSection;
delete DwarfLineSection;
delete DwarfFrameSection;
delete DwarfPubTypesSection;
delete DwarfDebugInlineSection;
delete DwarfStrSection;
delete DwarfLocSection;
delete DwarfARangesSection;
delete DwarfRangesSection;
delete DwarfMacroInfoSection;
}

View File

@ -0,0 +1,46 @@
//===- WDC65816Section.h - WDC65816-specific section representation -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the NVPTXSection class.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_WDC65816SECTION_H
#define LLVM_WDC65816SECTION_H
#include "llvm/IR/GlobalVariable.h"
#include "llvm/MC/MCSection.h"
#include <vector>
namespace llvm {
/// WDC65816Section - Represents a section in OMF
///
class WDC65816Section : public MCSection {
virtual void anchor();
public:
WDC65816Section(SectionVariant V, SectionKind K) : MCSection(V, K) {}
virtual ~WDC65816Section() {}
/// Override this as NVPTX has its own way of printing switching
/// to a section.
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
raw_ostream &OS,
const MCExpr *Subsection) const {}
/// Base address of PTX sections is zero.
virtual bool isBaseAddressKnownZero() const { return true; }
virtual bool UseCodeAlign() const { return false; }
virtual bool isVirtualSection() const { return false; }
virtual std::string getLabelBeginName() const { return ""; }
virtual std::string getLabelEndName() const { return ""; }
};
} // end namespace llvm
#endif

View File

@ -0,0 +1,87 @@
//===-- WDC65816TargetObjectFile.h - WDC65816 Object Info -------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_WDC65816_TARGETOBJECTFILE_H
#define LLVM_TARGET_WDC65816_TARGETOBJECTFILE_H
#include "WDC65816Section.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include <string>
namespace llvm {
class GlobalVariable;
class Module;
class WDC65816TargetObjectFile : public TargetLoweringObjectFile {
public:
WDC65816TargetObjectFile() {
TextSection = 0;
DataSection = 0;
BSSSection = 0;
ReadOnlySection = 0;
StaticCtorSection = 0;
StaticDtorSection = 0;
LSDASection = 0;
EHFrameSection = 0;
DwarfAbbrevSection = 0;
DwarfInfoSection = 0;
DwarfLineSection = 0;
DwarfFrameSection = 0;
DwarfPubTypesSection = 0;
DwarfDebugInlineSection = 0;
DwarfStrSection = 0;
DwarfLocSection = 0;
DwarfARangesSection = 0;
DwarfRangesSection = 0;
DwarfMacroInfoSection = 0;
}
virtual ~WDC65816TargetObjectFile();
virtual void Initialize(MCContext &ctx, const TargetMachine &TM) {
TargetLoweringObjectFile::Initialize(ctx, TM);
TextSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getText());
DataSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getDataRel());
BSSSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getBSS());
ReadOnlySection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getReadOnly());
StaticCtorSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
StaticDtorSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
LSDASection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
EHFrameSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfAbbrevSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfInfoSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfLineSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfFrameSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfPubTypesSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfDebugInlineSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfStrSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfLocSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfARangesSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfRangesSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
DwarfMacroInfoSection = new WDC65816Section(MCSection::SV_ELF, SectionKind::getMetadata());
}
virtual const MCSection *getSectionForConstant(SectionKind Kind) const {
return ReadOnlySection;
}
virtual const MCSection *
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const {
return DataSection;
}
};
} // end namespace llvm
#endif