aboutsummaryrefslogtreecommitdiff
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
parent8e9ece75db5045ec057efbbdba6550fa0d85e695 (diff)
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
-rw-r--r--include/llvm/MC/MCContext.h9
-rw-r--r--include/llvm/MC/MCSection.h58
-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
-rw-r--r--test/MC/AsmParser/labels.s4
-rw-r--r--tools/llvm-mc/AsmParser.cpp8
-rw-r--r--tools/llvm-mc/llvm-mc.cpp2
13 files changed, 161 insertions, 110 deletions
diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h
index a8187cce6f..f0f5e15555 100644
--- a/include/llvm/MC/MCContext.h
+++ b/include/llvm/MC/MCContext.h
@@ -41,8 +41,6 @@ namespace llvm {
/// We use a bump pointer allocator to avoid the need to track all allocated
/// objects.
BumpPtrAllocator Allocator;
-
- friend class MCSection;
public:
MCContext();
~MCContext();
@@ -51,6 +49,13 @@ namespace llvm {
/// null if it doesn't exist.
MCSection *GetSection(const StringRef &Name) const;
+
+ void SetSection(const StringRef &Name, MCSection *S) {
+ MCSection *&Entry = Sections[Name];
+ assert(Entry == 0 && "Multiple sections with the same name created");
+ Entry = S;
+ }
+
/// CreateSymbol - Create a new symbol with the specified @param Name.
///
/// @param Name - The symbol name, which must be unique across all symbols.
diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h
index 4e5969ab3e..4d505028db 100644
--- a/include/llvm/MC/MCSection.h
+++ b/include/llvm/MC/MCSection.h
@@ -27,27 +27,14 @@ namespace llvm {
/// section in the current translation unit. The MCContext class uniques and
/// creates these.
class MCSection {
- std::string Name;
-
- /// IsDirective - This is true if the section name is a directive, not
- /// something that should be printed with ".section".
- ///
- /// FIXME: This is a hack. Switch to a semantic view of the section instead
- /// of a syntactic one.
- bool IsDirective;
-
MCSection(const MCSection&); // DO NOT IMPLEMENT
void operator=(const MCSection&); // DO NOT IMPLEMENT
protected:
- MCSection(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx);
+ MCSection(SectionKind K) : Kind(K) {}
SectionKind Kind;
public:
virtual ~MCSection();
- const std::string &getName() const { return Name; }
- bool isDirective() const { return IsDirective; }
-
SectionKind getKind() const { return Kind; }
virtual void PrintSwitchToSection(const TargetAsmInfo &TAI,
@@ -56,36 +43,73 @@ namespace llvm {
class MCSectionELF : public MCSection {
+ std::string Name;
+
+ /// IsDirective - This is true if the section name is a directive, not
+ /// something that should be printed with ".section".
+ ///
+ /// FIXME: This is a hack. Switch to a semantic view of the section instead
+ /// of a syntactic one.
+ bool IsDirective;
+
MCSectionELF(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
+ MCContext &Ctx);
public:
static MCSectionELF *Create(const StringRef &Name, bool IsDirective,
SectionKind K, MCContext &Ctx);
+ const std::string &getName() const { return Name; }
+ bool isDirective() const { return IsDirective; }
+
+
virtual void PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const;
};
class MCSectionMachO : public MCSection {
+ std::string Name;
+
+ /// IsDirective - This is true if the section name is a directive, not
+ /// something that should be printed with ".section".
+ ///
+ /// FIXME: This is a hack. Switch to a semantic view of the section instead
+ /// of a syntactic one.
+ bool IsDirective;
+
MCSectionMachO(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
+ MCContext &Ctx);
public:
static MCSectionMachO *Create(const StringRef &Name, bool IsDirective,
SectionKind K, MCContext &Ctx);
+ const std::string &getName() const { return Name; }
+ bool isDirective() const { return IsDirective; }
+
virtual void PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const;
};
class MCSectionCOFF : public MCSection {
+ std::string Name;
+
+ /// IsDirective - This is true if the section name is a directive, not
+ /// something that should be printed with ".section".
+ ///
+ /// FIXME: This is a hack. Switch to a semantic view of the section instead
+ /// of a syntactic one.
+ bool IsDirective;
+
MCSectionCOFF(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
+ MCContext &Ctx);
public:
static MCSectionCOFF *Create(const StringRef &Name, bool IsDirective,
SectionKind K, MCContext &Ctx);
+
+ const std::string &getName() const { return Name; }
+ bool isDirective() const { return IsDirective; }
virtual void PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const;
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;
diff --git a/test/MC/AsmParser/labels.s b/test/MC/AsmParser/labels.s
index a5998c4dc3..d4c80315a4 100644
--- a/test/MC/AsmParser/labels.s
+++ b/test/MC/AsmParser/labels.s
@@ -29,8 +29,8 @@ foo:
// CHECK: .long 11
.long "a 0"
-// CHECK: .section "a 1,a 2"
-.section "a 1", "a 2"
+// XXCHCK: .section "a 1,a 2"
+//.section "a 1", "a 2"
// CHECK: .globl "a 3"
.globl "a 3"
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index 29657de5d8..8f6583a591 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -706,7 +706,7 @@ bool AsmParser::ParseDirectiveDarwinSection() {
// FIXME: Arch specific.
MCSection *S = Ctx.GetSection(Section);
if (S == 0)
- S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx);
+ S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx);
Out.SwitchSection(S);
return false;
@@ -727,7 +727,7 @@ bool AsmParser::ParseDirectiveSectionSwitch(const char *Section,
// FIXME: Arch specific.
MCSection *S = Ctx.GetSection(Section);
if (S == 0)
- S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx);
+ S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx);
Out.SwitchSection(S);
return false;
@@ -1118,7 +1118,7 @@ bool AsmParser::ParseDirectiveDarwinZerofill() {
// FIXME: Arch specific.
MCSection *S = Ctx.GetSection(Section);
if (S == 0)
- S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx);
+ S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx);
// Create the zerofill section but no symbol
Out.EmitZerofill(S);
@@ -1178,7 +1178,7 @@ bool AsmParser::ParseDirectiveDarwinZerofill() {
// FIXME: Arch specific.
MCSection *S = Ctx.GetSection(Section);
if (S == 0)
- S = MCSectionCOFF::Create(Section, false, SectionKind(), Ctx);
+ S = MCSectionMachO::Create(Section, false, SectionKind(), Ctx);
// Create the zerofill Symbol with Size and Pow2Alignment
Out.EmitZerofill(S, Sym, Size, Pow2Alignment);
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp
index 5c24a8d4ad..5f746f2e47 100644
--- a/tools/llvm-mc/llvm-mc.cpp
+++ b/tools/llvm-mc/llvm-mc.cpp
@@ -186,7 +186,7 @@ static int AssembleInput(const char *ProgName) {
OwningPtr<MCStreamer> Str(createAsmStreamer(Ctx, outs()));
// FIXME: Target hook & command line option for initial section.
- Str.get()->SwitchSection(MCSectionCOFF::Create("__TEXT,__text,"
+ Str.get()->SwitchSection(MCSectionMachO::Create("__TEXT,__text,"
"regular,pure_instructions",
false,
SectionKind::getText(),