forked from OSchip/llvm-project
Remove HasCrazyBSS and add a flag in TAI to indicate that '.section'
must be emitted for PowerPC-Linux '.bss' section llvm-svn: 78958
This commit is contained in:
parent
c36edfede5
commit
62e6a8bbe6
|
@ -30,28 +30,24 @@ class MCSectionELF : public MCSection {
|
|||
/// below.
|
||||
unsigned Flags;
|
||||
|
||||
/// HasCrazyBSS - PPC/Linux doesn't support the .bss directive, it
|
||||
/// needs .section .bss. TODO: replace this with a TAI method.
|
||||
bool HasCrazyBSS;
|
||||
|
||||
/// IsExplicit - Indicates that this section comes from globals with an
|
||||
/// explicit section specfied.
|
||||
bool IsExplicit;
|
||||
|
||||
MCSectionELF(const StringRef &Section, unsigned T, unsigned F,
|
||||
SectionKind K, bool hasCrazyBSS, bool isExplicit)
|
||||
SectionKind K, bool isExplicit)
|
||||
: MCSection(K), SectionName(Section.str()), Type(T), Flags(F),
|
||||
HasCrazyBSS(hasCrazyBSS), IsExplicit(isExplicit) {}
|
||||
IsExplicit(isExplicit) {}
|
||||
public:
|
||||
|
||||
static MCSectionELF *Create(const StringRef &Section, unsigned Type,
|
||||
unsigned Flags, SectionKind K,
|
||||
bool hasCrazyBSS, bool isExplicit,
|
||||
unsigned Flags, SectionKind K, bool isExplicit,
|
||||
MCContext &Ctx);
|
||||
|
||||
/// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
||||
/// should be printed before the section name
|
||||
bool ShouldOmitSectionDirective(const char *Name) const;
|
||||
bool ShouldOmitSectionDirective(const char *Name,
|
||||
const TargetAsmInfo &TAI) const;
|
||||
|
||||
/// ShouldPrintSectionType - Only prints the section type if supported
|
||||
bool ShouldPrintSectionType(unsigned Ty) const;
|
||||
|
|
|
@ -164,6 +164,11 @@ namespace llvm {
|
|||
/// Style" syntax for section switching ("#alloc,#write" etc) instead of the
|
||||
/// normal ELF syntax (,"a,w") in .section directives.
|
||||
bool SunStyleELFSectionSwitchSyntax; // Defaults to false.
|
||||
|
||||
/// UsesELFSectionDirectiveForBSS - This is true if this target uses ELF
|
||||
/// '.section' directive before the '.bss' one. It's used for PPC/Linux
|
||||
/// which doesn't support the '.bss' directive only.
|
||||
bool UsesELFSectionDirectiveForBSS; // Defaults to false.
|
||||
|
||||
//===--- Alignment Information ----------------------------------------===//
|
||||
|
||||
|
@ -336,6 +341,9 @@ namespace llvm {
|
|||
return SunStyleELFSectionSwitchSyntax;
|
||||
}
|
||||
|
||||
bool usesELFSectionDirectiveForBSS() const {
|
||||
return UsesELFSectionDirectiveForBSS;
|
||||
}
|
||||
|
||||
// Accessors.
|
||||
//
|
||||
|
|
|
@ -183,7 +183,6 @@ protected:
|
|||
|
||||
|
||||
class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
|
||||
bool HasCrazyBSS;
|
||||
mutable void *UniquingMap;
|
||||
protected:
|
||||
/// TLSDataSection - Section directive for Thread Local data.
|
||||
|
@ -209,13 +208,9 @@ protected:
|
|||
unsigned Flags, SectionKind Kind,
|
||||
bool IsExplicit = false) const;
|
||||
public:
|
||||
TargetLoweringObjectFileELF(// FIXME: REMOVE AFTER UNIQUING IS FIXED.
|
||||
bool hasCrazyBSS = false)
|
||||
: HasCrazyBSS(hasCrazyBSS), UniquingMap(0) {}
|
||||
|
||||
TargetLoweringObjectFileELF() : UniquingMap(0) {}
|
||||
~TargetLoweringObjectFileELF();
|
||||
|
||||
|
||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||
|
||||
/// getSectionForConstant - Given a constant with the SectionKind, return a
|
||||
|
|
|
@ -16,20 +16,21 @@ using namespace llvm;
|
|||
|
||||
MCSectionELF *MCSectionELF::
|
||||
Create(const StringRef &Section, unsigned Type, unsigned Flags,
|
||||
SectionKind K, bool hasCrazyBSS, bool isExplicit, MCContext &Ctx) {
|
||||
SectionKind K, bool isExplicit, MCContext &Ctx) {
|
||||
return new
|
||||
(Ctx) MCSectionELF(Section, Type, Flags, K, hasCrazyBSS, isExplicit);
|
||||
(Ctx) MCSectionELF(Section, Type, Flags, K, isExplicit);
|
||||
}
|
||||
|
||||
// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
||||
// should be printed before the section name
|
||||
bool MCSectionELF::ShouldOmitSectionDirective(const char *Name) const {
|
||||
bool MCSectionELF::ShouldOmitSectionDirective(const char *Name,
|
||||
const TargetAsmInfo &TAI) const {
|
||||
|
||||
// PPC/Linux doesn't support the .bss directive, it needs .section .bss.
|
||||
// FIXME: Does .section .bss/.data/.text work everywhere??
|
||||
if ((!HasCrazyBSS && strncmp(Name, ".bss", 4) == 0) ||
|
||||
strncmp(Name, ".text", 5) == 0 ||
|
||||
strncmp(Name, ".data", 5) == 0)
|
||||
if (strncmp(Name, ".text", 5) == 0 ||
|
||||
strncmp(Name, ".data", 5) == 0 ||
|
||||
(strncmp(Name, ".bss", 4) == 0 &&
|
||||
!TAI.usesELFSectionDirectiveForBSS()))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -46,8 +47,8 @@ bool MCSectionELF::ShouldPrintSectionType(unsigned Ty) const {
|
|||
|
||||
void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI,
|
||||
raw_ostream &OS) const {
|
||||
|
||||
if (ShouldOmitSectionDirective(SectionName.c_str())) {
|
||||
|
||||
if (ShouldOmitSectionDirective(SectionName.c_str(), TAI)) {
|
||||
OS << '\t' << getSectionName() << '\n';
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ cl::desc("enable preincrement load/store generation on PPC (experimental)"),
|
|||
static TargetLoweringObjectFile *CreateTLOF(const PPCTargetMachine &TM) {
|
||||
if (TM.getSubtargetImpl()->isDarwin())
|
||||
return new TargetLoweringObjectFileMachO();
|
||||
return new TargetLoweringObjectFileELF(true);
|
||||
return new TargetLoweringObjectFileELF();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -30,6 +30,9 @@ PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(bool is64Bit) {
|
|||
PrivateGlobalPrefix = ".L";
|
||||
UsedDirective = "\t# .no_dead_strip\t";
|
||||
WeakRefDirective = "\t.weak\t";
|
||||
|
||||
// Uses '.section' before '.bss' directive
|
||||
UsesELFSectionDirectiveForBSS = true;
|
||||
|
||||
// Debug Information
|
||||
AbsoluteDebugSectionOffsets = true;
|
||||
|
|
|
@ -50,6 +50,7 @@ TargetAsmInfo::TargetAsmInfo() {
|
|||
Data32bitsDirective = "\t.long\t";
|
||||
Data64bitsDirective = "\t.quad\t";
|
||||
SunStyleELFSectionSwitchSyntax = false;
|
||||
UsesELFSectionDirectiveForBSS = false;
|
||||
AlignDirective = "\t.align\t";
|
||||
AlignmentIsInBytes = true;
|
||||
TextAlignFillValue = 0;
|
||||
|
|
|
@ -298,8 +298,8 @@ getELFSection(StringRef Section, unsigned Type, unsigned Flags,
|
|||
const MCSectionELF *&Entry = Map[Section];
|
||||
if (Entry) return Entry;
|
||||
|
||||
return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, HasCrazyBSS,
|
||||
IsExplicit, getContext());
|
||||
return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit,
|
||||
getContext());
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
; Test to make sure that bss sections are printed with '.section' directive.
|
||||
; RUN: llvm-as < %s | llc -mtriple=powerpc-unknown-linux-gnu | FileCheck %s
|
||||
|
||||
@A = global i32 0
|
||||
|
||||
; CHECK: .section .bss,"aw",@nobits
|
||||
; CHECK: .global A
|
||||
|
Loading…
Reference in New Issue