mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-26 07:24:25 +00:00
eliminate TargetLoweringObjectFileSparc in favor of a TAI hook.
A TAI hook is appropriate in this case because this is just an asm syntax issue, not a semantic difference. TLOF should model the semantics of the section. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78498 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -158,6 +158,11 @@ namespace llvm {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// SunStyleELFSectionSwitchSyntax - This is true if this target uses "Sun
|
||||||
|
/// Style" syntax for section switching ("#alloc,#write" etc) instead of the
|
||||||
|
/// normal ELF syntax (,"a,w") in .section directives.
|
||||||
|
bool SunStyleELFSectionSwitchSyntax; // Defaults to false.
|
||||||
|
|
||||||
//===--- Alignment Information ----------------------------------------===//
|
//===--- Alignment Information ----------------------------------------===//
|
||||||
|
|
||||||
/// AlignDirective - The directive used to emit round up to an alignment
|
/// AlignDirective - The directive used to emit round up to an alignment
|
||||||
@ -326,6 +331,11 @@ namespace llvm {
|
|||||||
return AS == 0 ? Data64bitsDirective : getDataASDirective(64, AS);
|
return AS == 0 ? Data64bitsDirective : getDataASDirective(64, AS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool usesSunStyleELFSectionSwitchSyntax() const {
|
||||||
|
return SunStyleELFSectionSwitchSyntax;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Accessors.
|
// Accessors.
|
||||||
//
|
//
|
||||||
|
@ -25,6 +25,7 @@ namespace llvm {
|
|||||||
class GlobalValue;
|
class GlobalValue;
|
||||||
class Mangler;
|
class Mangler;
|
||||||
class TargetMachine;
|
class TargetMachine;
|
||||||
|
class TargetAsmInfo;
|
||||||
|
|
||||||
class TargetLoweringObjectFile {
|
class TargetLoweringObjectFile {
|
||||||
MCContext *Ctx;
|
MCContext *Ctx;
|
||||||
@ -172,7 +173,8 @@ public:
|
|||||||
/// into a string that can be printed to the assembly file after the
|
/// into a string that can be printed to the assembly file after the
|
||||||
/// ".section foo" part of a section directive.
|
/// ".section foo" part of a section directive.
|
||||||
virtual void getSectionFlagsAsString(SectionKind Kind,
|
virtual void getSectionFlagsAsString(SectionKind Kind,
|
||||||
SmallVectorImpl<char> &Str) const {
|
SmallVectorImpl<char> &Str,
|
||||||
|
const TargetAsmInfo &TAI) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -229,7 +231,8 @@ public:
|
|||||||
Mangler *Mang, const TargetMachine &TM) const;
|
Mangler *Mang, const TargetMachine &TM) const;
|
||||||
|
|
||||||
void getSectionFlagsAsString(SectionKind Kind,
|
void getSectionFlagsAsString(SectionKind Kind,
|
||||||
SmallVectorImpl<char> &Str) const;
|
SmallVectorImpl<char> &Str,
|
||||||
|
const TargetAsmInfo &TAI) const;
|
||||||
|
|
||||||
virtual const MCSection *
|
virtual const MCSection *
|
||||||
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||||
@ -286,7 +289,8 @@ public:
|
|||||||
Mangler *Mang, const TargetMachine &TM) const;
|
Mangler *Mang, const TargetMachine &TM) const;
|
||||||
|
|
||||||
virtual void getSectionFlagsAsString(SectionKind Kind,
|
virtual void getSectionFlagsAsString(SectionKind Kind,
|
||||||
SmallVectorImpl<char> &Str) const;
|
SmallVectorImpl<char> &Str,
|
||||||
|
const TargetAsmInfo &TAI) const;
|
||||||
|
|
||||||
virtual const MCSection *
|
virtual const MCSection *
|
||||||
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||||
|
@ -99,7 +99,7 @@ void AsmPrinter::SwitchToSection(const MCSection *NS) {
|
|||||||
// some magic assembler directive.
|
// some magic assembler directive.
|
||||||
if (!NS->isDirective()) {
|
if (!NS->isDirective()) {
|
||||||
SmallString<32> FlagsStr;
|
SmallString<32> FlagsStr;
|
||||||
getObjFileLowering().getSectionFlagsAsString(NS->getKind(), FlagsStr);
|
getObjFileLowering().getSectionFlagsAsString(NS->getKind(), FlagsStr, *TAI);
|
||||||
|
|
||||||
O << TAI->getSwitchToSectionDirective()
|
O << TAI->getSwitchToSectionDirective()
|
||||||
<< CurrentSection->getName() << FlagsStr.c_str() << '\n';
|
<< CurrentSection->getName() << FlagsStr.c_str() << '\n';
|
||||||
|
@ -549,34 +549,8 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
class TargetLoweringObjectFileSparc : public TargetLoweringObjectFileELF {
|
|
||||||
public:
|
|
||||||
void getSectionFlagsAsString(SectionKind Kind,
|
|
||||||
SmallVectorImpl<char> &Str) const {
|
|
||||||
if (Kind.isMergeableConst() || Kind.isMergeableCString())
|
|
||||||
return TargetLoweringObjectFileELF::getSectionFlagsAsString(Kind, Str);
|
|
||||||
|
|
||||||
// FIXME: Inefficient.
|
|
||||||
std::string Res;
|
|
||||||
if (!Kind.isMetadata())
|
|
||||||
Res += ",#alloc";
|
|
||||||
if (Kind.isText())
|
|
||||||
Res += ",#execinstr";
|
|
||||||
if (Kind.isWriteable())
|
|
||||||
Res += ",#write";
|
|
||||||
if (Kind.isThreadLocal())
|
|
||||||
Res += ",#tls";
|
|
||||||
|
|
||||||
Str.append(Res.begin(), Res.end());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
|
SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
|
||||||
: TargetLowering(TM, new TargetLoweringObjectFileSparc()) {
|
: TargetLowering(TM, new TargetLoweringObjectFileELF()) {
|
||||||
|
|
||||||
// Set up the register classes.
|
// Set up the register classes.
|
||||||
addRegisterClass(MVT::i32, SP::IntRegsRegisterClass);
|
addRegisterClass(MVT::i32, SP::IntRegsRegisterClass);
|
||||||
|
@ -22,6 +22,8 @@ SparcELFTargetAsmInfo::SparcELFTargetAsmInfo() {
|
|||||||
ZeroDirective = "\t.skip\t";
|
ZeroDirective = "\t.skip\t";
|
||||||
CommentString = "!";
|
CommentString = "!";
|
||||||
COMMDirectiveTakesAlignment = true;
|
COMMDirectiveTakesAlignment = true;
|
||||||
|
|
||||||
|
SunStyleELFSectionSwitchSyntax = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ TargetAsmInfo::TargetAsmInfo() {
|
|||||||
Data16bitsDirective = "\t.short\t";
|
Data16bitsDirective = "\t.short\t";
|
||||||
Data32bitsDirective = "\t.long\t";
|
Data32bitsDirective = "\t.long\t";
|
||||||
Data64bitsDirective = "\t.quad\t";
|
Data64bitsDirective = "\t.quad\t";
|
||||||
|
SunStyleELFSectionSwitchSyntax = false;
|
||||||
AlignDirective = "\t.align\t";
|
AlignDirective = "\t.align\t";
|
||||||
AlignmentIsInBytes = true;
|
AlignmentIsInBytes = true;
|
||||||
TextAlignFillValue = 0;
|
TextAlignFillValue = 0;
|
||||||
|
@ -18,8 +18,9 @@
|
|||||||
#include "llvm/GlobalVariable.h"
|
#include "llvm/GlobalVariable.h"
|
||||||
#include "llvm/MC/MCContext.h"
|
#include "llvm/MC/MCContext.h"
|
||||||
#include "llvm/MC/MCSection.h"
|
#include "llvm/MC/MCSection.h"
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetAsmInfo.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
#include "llvm/Target/TargetOptions.h"
|
#include "llvm/Target/TargetOptions.h"
|
||||||
#include "llvm/Support/Mangler.h"
|
#include "llvm/Support/Mangler.h"
|
||||||
#include "llvm/ADT/StringExtras.h"
|
#include "llvm/ADT/StringExtras.h"
|
||||||
@ -407,7 +408,25 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
|||||||
|
|
||||||
|
|
||||||
void TargetLoweringObjectFileELF::
|
void TargetLoweringObjectFileELF::
|
||||||
getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
|
getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str,
|
||||||
|
const TargetAsmInfo &TAI) const {
|
||||||
|
// Handle the weird solaris syntax if desired.
|
||||||
|
if (TAI.usesSunStyleELFSectionSwitchSyntax() &&
|
||||||
|
!Kind.isMergeableConst() && !Kind.isMergeableCString()) {
|
||||||
|
// FIXME: Inefficient.
|
||||||
|
std::string Res;
|
||||||
|
if (!Kind.isMetadata())
|
||||||
|
Res += ",#alloc";
|
||||||
|
if (Kind.isText())
|
||||||
|
Res += ",#execinstr";
|
||||||
|
if (Kind.isWriteable())
|
||||||
|
Res += ",#write";
|
||||||
|
if (Kind.isThreadLocal())
|
||||||
|
Res += ",#tls";
|
||||||
|
Str.append(Res.begin(), Res.end());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Str.push_back(',');
|
Str.push_back(',');
|
||||||
Str.push_back('"');
|
Str.push_back('"');
|
||||||
|
|
||||||
@ -848,7 +867,8 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
|||||||
|
|
||||||
|
|
||||||
void TargetLoweringObjectFileCOFF::
|
void TargetLoweringObjectFileCOFF::
|
||||||
getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
|
getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str,
|
||||||
|
const TargetAsmInfo &TAI) const {
|
||||||
// FIXME: Inefficient.
|
// FIXME: Inefficient.
|
||||||
std::string Res = ",\"";
|
std::string Res = ",\"";
|
||||||
if (Kind.isText())
|
if (Kind.isText())
|
||||||
|
Reference in New Issue
Block a user