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:
Chris Lattner 2009-08-08 20:43:12 +00:00
parent 17421d81fd
commit 5277b22687
7 changed files with 45 additions and 34 deletions

View File

@ -158,6 +158,11 @@ namespace llvm {
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 ----------------------------------------===//
/// AlignDirective - The directive used to emit round up to an alignment
@ -326,6 +331,11 @@ namespace llvm {
return AS == 0 ? Data64bitsDirective : getDataASDirective(64, AS);
}
bool usesSunStyleELFSectionSwitchSyntax() const {
return SunStyleELFSectionSwitchSyntax;
}
// Accessors.
//

View File

@ -25,6 +25,7 @@ namespace llvm {
class GlobalValue;
class Mangler;
class TargetMachine;
class TargetAsmInfo;
class TargetLoweringObjectFile {
MCContext *Ctx;
@ -172,7 +173,8 @@ public:
/// into a string that can be printed to the assembly file after the
/// ".section foo" part of a section directive.
virtual void getSectionFlagsAsString(SectionKind Kind,
SmallVectorImpl<char> &Str) const {
SmallVectorImpl<char> &Str,
const TargetAsmInfo &TAI) const {
}
protected:
@ -229,7 +231,8 @@ public:
Mangler *Mang, const TargetMachine &TM) const;
void getSectionFlagsAsString(SectionKind Kind,
SmallVectorImpl<char> &Str) const;
SmallVectorImpl<char> &Str,
const TargetAsmInfo &TAI) const;
virtual const MCSection *
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
@ -286,7 +289,8 @@ public:
Mangler *Mang, const TargetMachine &TM) const;
virtual void getSectionFlagsAsString(SectionKind Kind,
SmallVectorImpl<char> &Str) const;
SmallVectorImpl<char> &Str,
const TargetAsmInfo &TAI) const;
virtual const MCSection *
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,

View File

@ -99,7 +99,7 @@ void AsmPrinter::SwitchToSection(const MCSection *NS) {
// some magic assembler directive.
if (!NS->isDirective()) {
SmallString<32> FlagsStr;
getObjFileLowering().getSectionFlagsAsString(NS->getKind(), FlagsStr);
getObjFileLowering().getSectionFlagsAsString(NS->getKind(), FlagsStr, *TAI);
O << TAI->getSwitchToSectionDirective()
<< CurrentSection->getName() << FlagsStr.c_str() << '\n';

View File

@ -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)
: TargetLowering(TM, new TargetLoweringObjectFileSparc()) {
: TargetLowering(TM, new TargetLoweringObjectFileELF()) {
// Set up the register classes.
addRegisterClass(MVT::i32, SP::IntRegsRegisterClass);

View File

@ -22,6 +22,8 @@ SparcELFTargetAsmInfo::SparcELFTargetAsmInfo() {
ZeroDirective = "\t.skip\t";
CommentString = "!";
COMMDirectiveTakesAlignment = true;
SunStyleELFSectionSwitchSyntax = true;
}

View File

@ -49,6 +49,7 @@ TargetAsmInfo::TargetAsmInfo() {
Data16bitsDirective = "\t.short\t";
Data32bitsDirective = "\t.long\t";
Data64bitsDirective = "\t.quad\t";
SunStyleELFSectionSwitchSyntax = false;
AlignDirective = "\t.align\t";
AlignmentIsInBytes = true;
TextAlignFillValue = 0;

View File

@ -18,8 +18,9 @@
#include "llvm/GlobalVariable.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCSection.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Support/Mangler.h"
#include "llvm/ADT/StringExtras.h"
@ -407,7 +408,25 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
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('"');
@ -848,7 +867,8 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
void TargetLoweringObjectFileCOFF::
getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str,
const TargetAsmInfo &TAI) const {
// FIXME: Inefficient.
std::string Res = ",\"";
if (Kind.isText())