summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-08-08 23:39:42 +0000
committerChris Lattner <sabre@nondot.org>2009-08-08 23:39:42 +0000
commit93b6db3de934a3cfca5586df25184fef4a54c500 (patch)
tree3c32466a689b69726787f2b72bcdaf6a3879df50 /lib
parent8e9ece75db5045ec057efbbdba6550fa0d85e695 (diff)
downloadllvm-93b6db3de934a3cfca5586df25184fef4a54c500.tar.gz
llvm-93b6db3de934a3cfca5586df25184fef4a54c500.tar.bz2
llvm-93b6db3de934a3cfca5586df25184fef4a54c500.tar.xz
sink the 'name' and 'isdirective' state out of MCSection into its derived classes.
This totally optimizes PIC16 sections by not having an 'isdirective' bit anymore!! ;-) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78517 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.cpp7
-rw-r--r--lib/CodeGen/ELFWriter.cpp20
-rw-r--r--lib/MC/MCAsmStreamer.cpp20
-rw-r--r--lib/MC/MCSection.cpp27
-rw-r--r--lib/Target/PIC16/PIC16AsmPrinter.cpp10
-rw-r--r--lib/Target/PIC16/PIC16Section.h20
-rw-r--r--lib/Target/PIC16/PIC16TargetObjectFile.cpp77
-rw-r--r--lib/Target/PIC16/PIC16TargetObjectFile.h9
8 files changed, 106 insertions, 84 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index be481bdc27..c05e84772f 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2133,13 +2133,12 @@ void DwarfDebug::EmitDebugLines() {
// Isolate current sections line info.
const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
- if (Asm->isVerbose()) {
+ /*if (Asm->isVerbose()) {
const MCSection *S = SectionMap[j + 1];
O << '\t' << TAI->getCommentString() << " Section"
<< S->getName() << '\n';
- } else {
- Asm->EOL();
- }
+ }*/
+ Asm->EOL();
// Dwarf assumes we start with first line of first source file.
unsigned Source = 1;
diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp
index 42fe56df61..ca79d9dcaf 100644
--- a/lib/CodeGen/ELFWriter.cpp
+++ b/lib/CodeGen/ELFWriter.cpp
@@ -179,21 +179,21 @@ void ELFWriter::addExternalSymbol(const char *External) {
// getCtorSection - Get the static constructor section
ELFSection &ELFWriter::getCtorSection() {
const MCSection *Ctor = TLOF.getStaticCtorSection();
- return getSection(Ctor->getName(), ELFSection::SHT_PROGBITS,
+ return getSection(((MCSectionELF*)Ctor)->getName(), ELFSection::SHT_PROGBITS,
getElfSectionFlags(Ctor->getKind()));
}
// getDtorSection - Get the static destructor section
ELFSection &ELFWriter::getDtorSection() {
const MCSection *Dtor = TLOF.getStaticDtorSection();
- return getSection(Dtor->getName(), ELFSection::SHT_PROGBITS,
+ return getSection(((MCSectionELF*)Dtor)->getName(), ELFSection::SHT_PROGBITS,
getElfSectionFlags(Dtor->getKind()));
}
// getTextSection - Get the text section for the specified function
ELFSection &ELFWriter::getTextSection(Function *F) {
const MCSection *Text = TLOF.SectionForGlobal(F, Mang, TM);
- return getSection(Text->getName(), ELFSection::SHT_PROGBITS,
+ return getSection(((MCSectionELF*)Text)->getName(), ELFSection::SHT_PROGBITS,
getElfSectionFlags(Text->getKind()));
}
@@ -201,7 +201,7 @@ ELFSection &ELFWriter::getTextSection(Function *F) {
// emitting jump tables. TODO: add PIC support
ELFSection &ELFWriter::getJumpTableSection() {
const MCSection *JT = TLOF.getSectionForConstant(SectionKind::getReadOnly());
- return getSection(JT->getName(),
+ return getSection(((MCSectionELF*)JT)->getName(),
ELFSection::SHT_PROGBITS,
getElfSectionFlags(JT->getKind()),
TM.getTargetData()->getPointerABIAlignment());
@@ -226,7 +226,8 @@ ELFSection &ELFWriter::getConstantPoolSection(MachineConstantPoolEntry &CPE) {
}
}
- return getSection(TLOF.getSectionForConstant(Kind)->getName(),
+ const MCSection *CPSect = TLOF.getSectionForConstant(Kind);
+ return getSection(((MCSectionELF*)CPSect)->getName(),
ELFSection::SHT_PROGBITS,
getElfSectionFlags(Kind),
CPE.getAlignment());
@@ -369,7 +370,8 @@ void ELFWriter::EmitGlobal(const GlobalValue *GV) {
if (isELFCommonSym(GVar)) {
GblSym->SectionIdx = ELFSection::SHN_COMMON;
- getSection(S->getName(), ELFSection::SHT_NOBITS, SectionFlags, 1);
+ getSection(((MCSectionELF*)S)->getName(),
+ ELFSection::SHT_NOBITS, SectionFlags, 1);
// A new linkonce section is created for each global in the
// common section, the default alignment is 1 and the symbol
@@ -378,7 +380,8 @@ void ELFWriter::EmitGlobal(const GlobalValue *GV) {
} else if (isELFBssSym(GVar, Kind)) {
ELFSection &ES =
- getSection(S->getName(), ELFSection::SHT_NOBITS, SectionFlags);
+ getSection(((MCSectionELF*)S)->getName(), ELFSection::SHT_NOBITS,
+ SectionFlags);
GblSym->SectionIdx = ES.SectionIdx;
// Update the size with alignment and the next object can
@@ -393,7 +396,8 @@ void ELFWriter::EmitGlobal(const GlobalValue *GV) {
} else { // The symbol must go to some kind of data section
ELFSection &ES =
- getSection(S->getName(), ELFSection::SHT_PROGBITS, SectionFlags);
+ getSection(((MCSectionELF*)S)->getName(), ELFSection::SHT_PROGBITS,
+ SectionFlags);
GblSym->SectionIdx = ES.SectionIdx;
// GblSym->Value should contain the symbol offset inside the section,
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index a71174a77b..0aed948d30 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -100,13 +100,6 @@ static inline bool NeedsQuoting(const StringRef &Str) {
return false;
}
-/// Allow printing sections directly to a raw_ostream with proper quoting.
-static inline raw_ostream &operator<<(raw_ostream &os, const MCSection *S) {
- if (NeedsQuoting(S->getName()))
- return os << '"' << S->getName() << '"';
- return os << S->getName();
-}
-
/// Allow printing symbols directly to a raw_ostream with proper quoting.
static inline raw_ostream &operator<<(raw_ostream &os, const MCSymbol *S) {
if (NeedsQuoting(S->getName()))
@@ -144,10 +137,8 @@ void MCAsmStreamer::SwitchSection(MCSection *Section) {
if (Section != CurSection) {
CurSection = Section;
- // FIXME: Really we would like the segment, flags, etc. to be separate
- // values instead of embedded in the name. Not all assemblers understand all
- // this stuff though.
- OS << ".section " << Section << "\n";
+ // FIXME: Needs TargetAsmInfo!
+ Section->PrintSwitchToSection(*(const TargetAsmInfo*)0, OS);
}
}
@@ -228,7 +219,12 @@ void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
// FIXME: Really we would like the segment and section names as well as the
// section type to be separate values instead of embedded in the name. Not
// all assemblers understand all this stuff though.
- OS << ".zerofill " << Section;
+ OS << ".zerofill ";
+
+ // This is a mach-o specific directive.
+ OS << '"' << ((MCSectionMachO*)Section)->getName() << '"';
+
+
if (Symbol != NULL) {
OS << ',' << Symbol << ',' << Size;
if (Pow2Alignment != 0)
diff --git a/lib/MC/MCSection.cpp b/lib/MC/MCSection.cpp
index a1f5664859..80a80e7d8d 100644
--- a/lib/MC/MCSection.cpp
+++ b/lib/MC/MCSection.cpp
@@ -20,13 +20,6 @@ using namespace llvm;
MCSection::~MCSection() {
}
-MCSection::MCSection(const StringRef &N, bool isDirective, SectionKind K,
- MCContext &Ctx)
- : Name(N), IsDirective(isDirective), Kind(K) {
- MCSection *&Entry = Ctx.Sections[Name];
- assert(Entry == 0 && "Multiple sections with the same name created");
- Entry = this;
-}
//===----------------------------------------------------------------------===//
// MCSectionELF
@@ -37,6 +30,13 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
return new (Ctx) MCSectionELF(Name, IsDirective, K, Ctx);
}
+MCSectionELF::MCSectionELF(const StringRef &name, bool isDirective,
+ SectionKind K, MCContext &Ctx)
+ : MCSection(K), Name(name), IsDirective(isDirective) {
+ Ctx.SetSection(Name, this);
+}
+
+
void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const {
if (isDirective()) {
@@ -118,6 +118,12 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
return new (Ctx) MCSectionMachO(Name, IsDirective, K, Ctx);
}
+MCSectionMachO::MCSectionMachO(const StringRef &name, bool isDirective,
+ SectionKind K, MCContext &Ctx)
+ : MCSection(K), Name(name), IsDirective(isDirective) {
+ Ctx.SetSection(Name, this);
+}
+
void MCSectionMachO::PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const {
if (!isDirective())
@@ -135,6 +141,13 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
return new (Ctx) MCSectionCOFF(Name, IsDirective, K, Ctx);
}
+MCSectionCOFF::MCSectionCOFF(const StringRef &name, bool isDirective,
+ SectionKind K, MCContext &Ctx)
+ : MCSection(K), Name(name), IsDirective(isDirective) {
+ Ctx.SetSection(Name, this);
+}
+
+
void MCSectionCOFF::PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const {
diff --git a/lib/Target/PIC16/PIC16AsmPrinter.cpp b/lib/Target/PIC16/PIC16AsmPrinter.cpp
index dc332ffe6d..7a5fdc853c 100644
--- a/lib/Target/PIC16/PIC16AsmPrinter.cpp
+++ b/lib/Target/PIC16/PIC16AsmPrinter.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "PIC16AsmPrinter.h"
+#include "PIC16Section.h"
#include "PIC16TargetAsmInfo.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Function.h"
@@ -21,7 +22,6 @@
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/DwarfWriter.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
-#include "llvm/MC/MCSection.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Support/ErrorHandling.h"
@@ -227,9 +227,11 @@ bool PIC16AsmPrinter::doInitialization(Module &M) {
// Set the section names for all globals.
for (Module::global_iterator I = M.global_begin(), E = M.global_end();
I != E; ++I)
- if (!I->isDeclaration() && !I->hasAvailableExternallyLinkage())
- I->setSection(getObjFileLowering().
- SectionForGlobal(I, Mang,TM)->getName());
+ if (!I->isDeclaration() && !I->hasAvailableExternallyLinkage()) {
+ const MCSection *S = getObjFileLowering().SectionForGlobal(I, Mang, TM);
+
+ I->setSection(((const MCSectionPIC16*)S)->getName());
+ }
DbgInfo.BeginModule(M);
EmitFunctionDecls(M);
diff --git a/lib/Target/PIC16/PIC16Section.h b/lib/Target/PIC16/PIC16Section.h
index 4c2ae05707..f69cc2c807 100644
--- a/lib/Target/PIC16/PIC16Section.h
+++ b/lib/Target/PIC16/PIC16Section.h
@@ -15,27 +15,23 @@
#define LLVM_PIC16SECTION_H
#include "llvm/MC/MCSection.h"
-#include "llvm/MC/MCContext.h"
-#include "llvm/Support/raw_ostream.h"
namespace llvm {
class MCSectionPIC16 : public MCSection {
- MCSectionPIC16(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
+ std::string Name;
+
+ MCSectionPIC16(const StringRef &name, SectionKind K,
+ MCContext &Ctx);
public:
- static MCSectionPIC16 *Create(const StringRef &Name, bool IsDirective,
- SectionKind K, MCContext &Ctx) {
- return new (Ctx) MCSectionPIC16(Name, IsDirective, K, Ctx);
- }
+ const std::string &getName() const { return Name; }
+ static MCSectionPIC16 *Create(const StringRef &Name,
+ SectionKind K, MCContext &Ctx);
virtual void PrintSwitchToSection(const TargetAsmInfo &TAI,
- raw_ostream &OS) const {
- OS << getName() << '\n';
- }
-
+ raw_ostream &OS) const;
};
} // end namespace llvm
diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.cpp b/lib/Target/PIC16/PIC16TargetObjectFile.cpp
index a9668f9c07..ed1caf225e 100644
--- a/lib/Target/PIC16/PIC16TargetObjectFile.cpp
+++ b/lib/Target/PIC16/PIC16TargetObjectFile.cpp
@@ -15,17 +15,37 @@
#include "llvm/Module.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
+MCSectionPIC16::MCSectionPIC16(const StringRef &name, SectionKind K,
+ MCContext &Ctx) : MCSection(K), Name(name) {
+ Ctx.SetSection(Name, this);
+}
+
+MCSectionPIC16 *MCSectionPIC16::Create(const StringRef &Name,
+ SectionKind K, MCContext &Ctx) {
+ return new (Ctx) MCSectionPIC16(Name, K, Ctx);
+}
+
+
+void MCSectionPIC16::PrintSwitchToSection(const TargetAsmInfo &TAI,
+ raw_ostream &OS) const {
+ OS << getName() << '\n';
+}
+
+
+
+
PIC16TargetObjectFile::PIC16TargetObjectFile()
: ExternalVarDecls(0), ExternalVarDefs(0) {
}
-const MCSection *PIC16TargetObjectFile::
-getPIC16Section(const char *Name, bool isDirective, SectionKind Kind) const {
+const MCSectionPIC16 *PIC16TargetObjectFile::
+getPIC16Section(const char *Name, SectionKind Kind) const {
if (MCSection *S = getContext().GetSection(Name))
- return S;
- return MCSectionPIC16::Create(Name, isDirective, Kind, getContext());
+ return (MCSectionPIC16*)S;
+ return MCSectionPIC16::Create(Name, Kind, getContext());
}
@@ -33,39 +53,35 @@ void PIC16TargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &tm){
TargetLoweringObjectFile::Initialize(Ctx, tm);
TM = &tm;
- BSSSection = getPIC16Section("udata.# UDATA", false,
- SectionKind::getBSS());
- ReadOnlySection = getPIC16Section("romdata.# ROMDATA", false,
+ BSSSection = getPIC16Section("udata.# UDATA", SectionKind::getBSS());
+ ReadOnlySection = getPIC16Section("romdata.# ROMDATA",
SectionKind::getReadOnly());
- DataSection = getPIC16Section("idata.# IDATA", false,
- SectionKind::getDataRel());
+ DataSection = getPIC16Section("idata.# IDATA", SectionKind::getDataRel());
// Need because otherwise a .text symbol is emitted by DwarfWriter
// in BeginModule, and gpasm cribbs for that .text symbol.
- TextSection = getPIC16Section("", true, SectionKind::getText());
+ TextSection = getPIC16Section("", SectionKind::getText());
- ROSections.push_back(new PIC16Section(ReadOnlySection));
+ ROSections.push_back(new PIC16Section((MCSectionPIC16*)ReadOnlySection));
// FIXME: I don't know what the classification of these sections really is.
ExternalVarDecls = new PIC16Section(getPIC16Section("ExternalVarDecls",
- false,
SectionKind::getMetadata()));
ExternalVarDefs = new PIC16Section(getPIC16Section("ExternalVarDefs",
- false,
SectionKind::getMetadata()));
}
const MCSection *PIC16TargetObjectFile::
getSectionForFunction(const std::string &FnName) const {
std::string T = PAN::getCodeSectionName(FnName);
- return getPIC16Section(T.c_str(), false, SectionKind::getText());
+ return getPIC16Section(T.c_str(), SectionKind::getText());
}
const MCSection *PIC16TargetObjectFile::
getSectionForFunctionFrame(const std::string &FnName) const {
std::string T = PAN::getFrameSectionName(FnName);
- return getPIC16Section(T.c_str(), false, SectionKind::getDataRel());
+ return getPIC16Section(T.c_str(), SectionKind::getDataRel());
}
const MCSection *
@@ -92,9 +108,8 @@ PIC16TargetObjectFile::getBSSSectionForGlobal(const GlobalVariable *GV) const {
// No BSS section spacious enough was found. Crate a new one.
if (!FoundBSS) {
std::string name = PAN::getUdataSectionName(BSSSections.size());
- const MCSection *NewSection = getPIC16Section(name.c_str(), false,
- // FIXME.
- SectionKind::getMetadata());
+ const MCSectionPIC16 *NewSection
+ = getPIC16Section(name.c_str(), /*FIXME*/ SectionKind::getMetadata());
FoundBSS = new PIC16Section(NewSection);
@@ -134,9 +149,8 @@ PIC16TargetObjectFile::getIDATASectionForGlobal(const GlobalVariable *GV) const{
// No IDATA section spacious enough was found. Crate a new one.
if (!FoundIDATA) {
std::string name = PAN::getIdataSectionName(IDATASections.size());
- const MCSection *NewSection = getPIC16Section(name.c_str(), false,
- // FIXME.
- SectionKind::getMetadata());
+ const MCSectionPIC16 *NewSection =
+ getPIC16Section(name.c_str(), /*FIXME*/ SectionKind::getMetadata());
FoundIDATA = new PIC16Section(NewSection);
@@ -169,10 +183,8 @@ PIC16TargetObjectFile::getSectionForAuto(const GlobalVariable *GV) const {
// No Auto section was found. Crate a new one.
if (!FoundAutoSec) {
- const MCSection *NewSection = getPIC16Section(name.c_str(),
- // FIXME.
- false,
- SectionKind::getMetadata());
+ const MCSectionPIC16 *NewSection =
+ getPIC16Section(name.c_str(), /*FIXME*/ SectionKind::getMetadata());
FoundAutoSec = new PIC16Section(NewSection);
@@ -270,7 +282,7 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
return CreateSectionForGlobal(GVar, Mang);
}
- return getPIC16Section(GV->getSection().c_str(), false, Kind);
+ return getPIC16Section(GV->getSection().c_str(), Kind);
}
// Create a new section for global variable. If Addr is given then create
@@ -322,8 +334,8 @@ PIC16TargetObjectFile::CreateBSSSectionForGlobal(const GlobalVariable *GV,
PIC16Section *NewBSS = FoundBSS;
if (NewBSS == NULL) {
- const MCSection *NewSection = getPIC16Section(Name.c_str(), false,
- SectionKind::getBSS());
+ const MCSectionPIC16 *NewSection =
+ getPIC16Section(Name.c_str(), SectionKind::getBSS());
NewBSS = new PIC16Section(NewSection);
BSSSections.push_back(NewBSS);
}
@@ -374,9 +386,8 @@ PIC16TargetObjectFile::CreateIDATASectionForGlobal(const GlobalVariable *GV,
PIC16Section *NewIDATASec = FoundIDATASec;
if (NewIDATASec == NULL) {
- const MCSection *NewSection = getPIC16Section(Name.c_str(), false,
- // FIXME:
- SectionKind::getMetadata());
+ const MCSectionPIC16 *NewSection =
+ getPIC16Section(Name.c_str(), /* FIXME */SectionKind::getMetadata());
NewIDATASec = new PIC16Section(NewSection);
IDATASections.push_back(NewIDATASec);
}
@@ -414,8 +425,8 @@ PIC16TargetObjectFile::CreateROSectionForGlobal(const GlobalVariable *GV,
PIC16Section *NewRomSec = FoundROSec;
if (NewRomSec == NULL) {
- const MCSection *NewSection = getPIC16Section(Name.c_str(), false,
- SectionKind::getReadOnly());
+ const MCSectionPIC16 *NewSection =
+ getPIC16Section(Name.c_str(), SectionKind::getReadOnly());
NewRomSec = new PIC16Section(NewSection);
ROSections.push_back(NewRomSec);
}
diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.h b/lib/Target/PIC16/PIC16TargetObjectFile.h
index f8389a6adc..edd2b1cc15 100644
--- a/lib/Target/PIC16/PIC16TargetObjectFile.h
+++ b/lib/Target/PIC16/PIC16TargetObjectFile.h
@@ -17,6 +17,7 @@ namespace llvm {
class GlobalVariable;
class Module;
class PIC16TargetMachine;
+ class MCSectionPIC16;
enum { DataBankSize = 80 };
@@ -29,12 +30,12 @@ namespace llvm {
/// FIXME: MOVE ALL THIS STUFF TO MCSectionPIC16.
///
struct PIC16Section {
- const MCSection *S_; // Connection to actual Section.
+ const MCSectionPIC16 *S_; // Connection to actual Section.
unsigned Size; // Total size of the objects contained.
bool SectionPrinted;
std::vector<const GlobalVariable*> Items;
- PIC16Section(const MCSection *s) {
+ PIC16Section(const MCSectionPIC16 *s) {
S_ = s;
Size = 0;
SectionPrinted = false;
@@ -46,8 +47,8 @@ namespace llvm {
class PIC16TargetObjectFile : public TargetLoweringObjectFile {
const TargetMachine *TM;
- const MCSection *getPIC16Section(const char *Name, bool isDirective,
- SectionKind K) const;
+ const MCSectionPIC16 *getPIC16Section(const char *Name,
+ SectionKind K) const;
public:
mutable std::vector<PIC16Section*> BSSSections;
mutable std::vector<PIC16Section*> IDATASections;