mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-06 19:31:13 +00:00
Adding support for placing global objects in shared data memory.
llvm-svn: 85006
This commit is contained in:
parent
5f456758c6
commit
1fcb847e01
@ -298,6 +298,7 @@ bool PIC16AsmPrinter::doInitialization(Module &M) {
|
||||
EmitIData(M);
|
||||
EmitUData(M);
|
||||
EmitRomData(M);
|
||||
EmitSharedUdata(M);
|
||||
EmitUserSections(M);
|
||||
return Result;
|
||||
}
|
||||
@ -370,6 +371,11 @@ void PIC16AsmPrinter::EmitRomData(Module &M) {
|
||||
EmitSingleSection(PTOF->ROMDATASection());
|
||||
}
|
||||
|
||||
// Emit Shared section udata.
|
||||
void PIC16AsmPrinter::EmitSharedUdata(Module &M) {
|
||||
EmitSingleSection(PTOF->SHAREDUDATASection());
|
||||
}
|
||||
|
||||
bool PIC16AsmPrinter::doFinalization(Module &M) {
|
||||
EmitAllAutos(M);
|
||||
printLibcallDecls();
|
||||
|
@ -55,6 +55,7 @@ namespace llvm {
|
||||
void EmitUData (Module &M);
|
||||
void EmitAllAutos (Module &M);
|
||||
void EmitRomData (Module &M);
|
||||
void EmitSharedUdata(Module &M);
|
||||
void EmitUserSections (Module &M);
|
||||
void EmitFunctionFrame(MachineFunction &MF);
|
||||
void printLibcallDecls();
|
||||
|
@ -234,6 +234,12 @@ namespace llvm {
|
||||
return "romdata.#";
|
||||
}
|
||||
|
||||
static std::string getSharedUDataSectionName() {
|
||||
std::ostringstream o;
|
||||
o << getTagName(PREFIX_SYMBOL) << "udata_shr" << ".#";
|
||||
return o.str();
|
||||
}
|
||||
|
||||
static std::string getRomdataSectionName(unsigned num,
|
||||
std::string prefix = "") {
|
||||
std::ostringstream o;
|
||||
|
@ -144,7 +144,7 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) {
|
||||
}
|
||||
|
||||
// Get the section name(NewBank) for MemOp.
|
||||
// This assumes that the section names for globals are laready set by
|
||||
// This assumes that the section names for globals are already set by
|
||||
// AsmPrinter->doInitialization.
|
||||
std::string NewBank = CurBank;
|
||||
if (Op.getType() == MachineOperand::MO_GlobalAddress &&
|
||||
@ -156,7 +156,11 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) {
|
||||
std::string Sym = Op.getSymbolName();
|
||||
NewBank = PAN::getSectionNameForSym(Sym);
|
||||
}
|
||||
|
||||
|
||||
// If the section is shared section, do not emit banksel.
|
||||
if (NewBank == PAN::getSharedUDataSectionName())
|
||||
return Changed;
|
||||
|
||||
// If the previous and new section names are same, we don't need to
|
||||
// emit banksel.
|
||||
if (NewBank.compare(CurBank) != 0 ) {
|
||||
|
@ -72,6 +72,7 @@ getPIC16DataSection(const std::string &Name, PIC16SectionType Ty,
|
||||
case UDATA: UDATASections_.push_back(Entry); break;
|
||||
case IDATA: IDATASections_.push_back(Entry); break;
|
||||
case ROMDATA: ROMDATASection_ = Entry; break;
|
||||
case UDATA_SHR: SHAREDUDATASection_ = Entry; break;
|
||||
}
|
||||
|
||||
return Entry;
|
||||
@ -279,7 +280,10 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
std::string AddrStr = "Address=";
|
||||
if (SectName.compare(0, AddrStr.length(), AddrStr) == 0) {
|
||||
std::string SectAddr = SectName.substr(AddrStr.length());
|
||||
return allocateAtGivenAddress(GVar, SectAddr);
|
||||
if (SectAddr.compare("NEAR") == 0)
|
||||
return allocateSHARED(GVar, Mang);
|
||||
else
|
||||
return allocateAtGivenAddress(GVar, SectAddr);
|
||||
}
|
||||
|
||||
// Create the section specified with section attribute.
|
||||
@ -289,6 +293,25 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
return getPIC16DataSection(GV->getSection().c_str(), UDATA);
|
||||
}
|
||||
|
||||
const MCSection *
|
||||
PIC16TargetObjectFile::allocateSHARED(const GlobalVariable *GV,
|
||||
Mangler *Mang) const {
|
||||
// Make sure that this is an uninitialized global.
|
||||
assert(GV->hasInitializer() && "This global doesn't need space");
|
||||
if (!GV->getInitializer()->isNullValue()) {
|
||||
// FIXME: Generate a warning in this case that near qualifier will be
|
||||
// ignored.
|
||||
return SelectSectionForGlobal(GV, SectionKind::getDataRel(), Mang, *TM);
|
||||
}
|
||||
std::string Name = PAN::getSharedUDataSectionName();
|
||||
|
||||
PIC16Section *SharedUDataSect = getPIC16DataSection(Name.c_str(), UDATA_SHR);
|
||||
// Insert the GV into shared section.
|
||||
SharedUDataSect->Items.push_back(GV);
|
||||
return SharedUDataSect;
|
||||
}
|
||||
|
||||
|
||||
// Interface used by AsmPrinter to get a code section for a function.
|
||||
const PIC16Section *
|
||||
PIC16TargetObjectFile::SectionForCode(const std::string &FnName) const {
|
||||
|
@ -56,6 +56,7 @@ namespace llvm {
|
||||
mutable std::vector<PIC16Section *> UDATASections_;
|
||||
mutable std::vector<PIC16Section *> IDATASections_;
|
||||
mutable PIC16Section * ROMDATASection_;
|
||||
mutable PIC16Section * SHAREDUDATASection_;
|
||||
|
||||
/// Standard Auto Sections.
|
||||
mutable std::vector<PIC16Section *> AUTOSections_;
|
||||
@ -110,6 +111,10 @@ namespace llvm {
|
||||
/// Allocate DATA at user specified address.
|
||||
const MCSection *allocateAtGivenAddress(const GlobalVariable *GV,
|
||||
const std::string &Addr) const;
|
||||
|
||||
/// Allocate a shared variable to SHARED section.
|
||||
const MCSection *allocateSHARED(const GlobalVariable *GV,
|
||||
Mangler *Mang) const;
|
||||
|
||||
public:
|
||||
PIC16TargetObjectFile();
|
||||
@ -147,6 +152,9 @@ namespace llvm {
|
||||
const PIC16Section *ROMDATASection() const {
|
||||
return ROMDATASection_;
|
||||
}
|
||||
const PIC16Section *SHAREDUDATASection() const {
|
||||
return SHAREDUDATASection_;
|
||||
}
|
||||
const std::vector<PIC16Section *> &AUTOSections() const {
|
||||
return AUTOSections_;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user