diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-08-13 23:30:21 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-08-13 23:30:21 +0000 |
commit | fdf229eda95a542fc34d5182e1a91a22789ba122 (patch) | |
tree | 08f88c07f62f402320663b559c9f558a75849877 | |
parent | 0e275dc53880a7f14f8b8c83cc6e0290a215492d (diff) | |
download | external_llvm-fdf229eda95a542fc34d5182e1a91a22789ba122.zip external_llvm-fdf229eda95a542fc34d5182e1a91a22789ba122.tar.gz external_llvm-fdf229eda95a542fc34d5182e1a91a22789ba122.tar.bz2 |
Remove HasCrazyBSS and add a flag in TAI to indicate that '.section'
must be emitted for PowerPC-Linux '.bss' section
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78958 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCSectionELF.h | 14 | ||||
-rw-r--r-- | include/llvm/Target/TargetAsmInfo.h | 8 | ||||
-rw-r--r-- | include/llvm/Target/TargetLoweringObjectFile.h | 7 | ||||
-rw-r--r-- | lib/MC/MCSectionELF.cpp | 19 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCISelLowering.cpp | 2 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 3 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 4 | ||||
-rw-r--r-- | test/CodeGen/PowerPC/sections.ll | 8 |
9 files changed, 39 insertions, 27 deletions
diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h index 31e1e66..8d23b28 100644 --- a/include/llvm/MC/MCSectionELF.h +++ b/include/llvm/MC/MCSectionELF.h @@ -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; diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 2654025..cb0e346 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -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. // diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 2ee6d72..2264d36 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -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 diff --git a/lib/MC/MCSectionELF.cpp b/lib/MC/MCSectionELF.cpp index 56f8034..6e6f999 100644 --- a/lib/MC/MCSectionELF.cpp +++ b/lib/MC/MCSectionELF.cpp @@ -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; } diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 569026f..7ad81f8 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -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(); } diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 36cf2a5..864475b 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -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; diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 253d72c..20a5849 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -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; diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index edc9ed3..7cb87ef 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -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, diff --git a/test/CodeGen/PowerPC/sections.ll b/test/CodeGen/PowerPC/sections.ll new file mode 100644 index 0000000..21374d0 --- /dev/null +++ b/test/CodeGen/PowerPC/sections.ll @@ -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 + |