diff --git a/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.cpp b/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.cpp index 1afd3ee4f2d..3f719b99ff7 100644 --- a/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.cpp +++ b/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.cpp @@ -73,9 +73,6 @@ bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) { DbgInfo.BeginFunction(MF); - // Emit the autos section of function. - // EmitAutos(CurrentFnName); - // Now emit the instructions of function in its code section. const MCSection *fCodeSection = getObjFileLowering().SectionForCode(CurrentFnName); @@ -329,15 +326,11 @@ void PIC16AsmPrinter::EmitDefinedVars(Module &M) { // Emit initialized data placed in ROM. void PIC16AsmPrinter::EmitRomData(Module &M) { - // Print ROM Data section. - const PIC16Section *ROSection = PTOF->ROMDATASection(); - if (ROSection == NULL) return; - EmitInitializedDataSection(ROSection); + EmitSingleSection(PTOF->ROMDATASection()); } bool PIC16AsmPrinter::doFinalization(Module &M) { printLibcallDecls(); - // EmitRemainingAutos(); DbgInfo.EndModule(M); O << "\n\t" << "END\n"; return AsmPrinter::doFinalization(M); @@ -402,20 +395,13 @@ void PIC16AsmPrinter::EmitInitializedDataSection(const PIC16Section *S) { } } +// Print all IDATA sections. void PIC16AsmPrinter::EmitIData(Module &M) { - - // Print all IDATA sections. - const std::vector &IDATASections = PTOF->IDATASections(); - for (unsigned i = 0; i < IDATASections.size(); i++) { - O << "\n"; - if (IDATASections[i]->getName().find("llvm.") != std::string::npos) - continue; - - EmitInitializedDataSection(IDATASections[i]); - } + EmitSectionList (M, PTOF->IDATASections()); } -void PIC16AsmPrinter::EmitUninitializedDataSection(const PIC16Section *S) { +void PIC16AsmPrinter:: +EmitUninitializedDataSection(const PIC16Section *S) { const TargetData *TD = TM.getTargetData(); OutStreamer.SwitchSection(S); std::vector Items = S->Items; @@ -428,41 +414,52 @@ void PIC16AsmPrinter::EmitUninitializedDataSection(const PIC16Section *S) { } } +// Print all UDATA sections. void PIC16AsmPrinter::EmitUData(Module &M) { - // Print all UDATA sections. - const std::vector &UDATASections = PTOF->UDATASections(); - for (unsigned i = 0; i < UDATASections.size(); i++) { - O << "\n"; - EmitUninitializedDataSection(UDATASections[i]); - } + EmitSectionList (M, PTOF->UDATASections()); } +// Print all USER sections. void PIC16AsmPrinter::EmitUserSections(Module &M) { - const std::vector &USERSections = PTOF->USERSections(); - for (unsigned i = 0; i < USERSections.size(); i++) { - O << "\n"; - const PIC16Section *S = USERSections[i]; - if (S->isUDATA_Type()) { - EmitUninitializedDataSection(S); - } else if (S->isIDATA_Type() || S->isROMDATA_Type()) { - EmitInitializedDataSection(S); - } else { - llvm_unreachable ("unknow user section type"); - } - } + EmitSectionList (M, PTOF->USERSections()); } +// Print all AUTO sections. void PIC16AsmPrinter::EmitAllAutos(Module &M) { - // Print all AUTO sections. - const std::vector &AUTOSections = PTOF->AUTOSections(); - for (unsigned i = 0; i < AUTOSections.size(); i++) { - O << "\n"; - EmitUninitializedDataSection(AUTOSections[i]); - } + EmitSectionList (M, PTOF->AUTOSections()); } extern "C" void LLVMInitializePIC16AsmPrinter() { RegisterAsmPrinter X(ThePIC16Target); } +// Emit one data section using correct section emitter based on section type. +void PIC16AsmPrinter::EmitSingleSection(const PIC16Section *S) { + if (S == NULL) return; + + switch (S->getType()) { + default: llvm_unreachable ("unknow user section type"); + case UDATA: + case UDATA_SHR: + case UDATA_OVR: + EmitUninitializedDataSection(S); + break; + case IDATA: + case ROMDATA: + EmitInitializedDataSection(S); + break; + } +} + +// Emit a list of sections. +void PIC16AsmPrinter:: +EmitSectionList(Module &M, const std::vector &SList) { + for (unsigned i = 0; i < SList.size(); i++) { + // Exclude llvm specific metadata sections. + if (SList[i]->getName().find("llvm.") != std::string::npos) + continue; + O << "\n"; + EmitSingleSection(SList[i]); + } +} diff --git a/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.h b/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.h index 686d0808494..580e2fdb7bc 100644 --- a/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.h +++ b/lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.h @@ -60,6 +60,9 @@ namespace llvm { void printLibcallDecls(); void EmitUninitializedDataSection(const PIC16Section *S); void EmitInitializedDataSection(const PIC16Section *S); + void EmitSingleSection(const PIC16Section *S); + void EmitSectionList(Module &M, + const std::vector< PIC16Section *> &SList); protected: bool doInitialization(Module &M); bool doFinalization(Module &M); diff --git a/lib/Target/PIC16/PIC16ABINames.h b/lib/Target/PIC16/PIC16ABINames.h index 00e9e457144..7fa1721a76b 100644 --- a/lib/Target/PIC16/PIC16ABINames.h +++ b/lib/Target/PIC16/PIC16ABINames.h @@ -40,6 +40,7 @@ namespace llvm { // Global variables do not have any '.' in their names. // These are maily function names and global variable names. // Example - @foo, @i + // Static local variables - @. // ------------------------------------------------------- // Functions and auto variables. // Names are mangled as .. @@ -67,8 +68,12 @@ namespace llvm { // SECTION Names // uninitialized globals - @udata..# // initialized globals - @idata..# + // Program memory data - @romdata.# + // Variables with user defined section name - + // Variables with user defined address - @.user_section.
.# // Function frame - @.frame_section. // Function autos - @.autos_section. + // Overlay sections - @.## // Declarations - Enclosed in comments. No section for them. //---------------------------------------------------------- diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.cpp b/lib/Target/PIC16/PIC16TargetObjectFile.cpp index 330722d4a9c..11c579cc570 100644 --- a/lib/Target/PIC16/PIC16TargetObjectFile.cpp +++ b/lib/Target/PIC16/PIC16TargetObjectFile.cpp @@ -22,6 +22,9 @@ using namespace llvm; PIC16TargetObjectFile::PIC16TargetObjectFile() { } +PIC16TargetObjectFile::~PIC16TargetObjectFile() { +} + /// Find a pic16 section. If not found, create one. PIC16Section *PIC16TargetObjectFile:: getPIC16Section(const std::string &Name, PIC16SectionType Ty, @@ -104,19 +107,11 @@ getPIC16UserSection(const std::string &Name, PIC16SectionType Ty, return Entry; } -/// Do some standard llvm stuff. PIC16 really does not need any of this. +/// Do some standard initialization. void PIC16TargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &tm){ TargetLoweringObjectFile::Initialize(Ctx, tm); TM = &tm; - // BSSSection = getPIC16DataSection("udata.#", UDATA); - // ReadOnlySection = getPIC16DataSection("romdata.#", ROMDATA); - // DataSection = getPIC16DataSection("idata.#", IDATA); - - // Need because otherwise a .text symbol is emitted by DwarfWriter - // in BeginModule, and gpasm cribbs for that .text symbol. - // FIXME: below - // TextSection = getPIC16DataSection("", UDATA); ROMDATASection_ = NULL; } @@ -254,22 +249,7 @@ PIC16TargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV1, return TargetLoweringObjectFile::SelectSectionForGlobal(GV, Kind, Mang,TM); } -PIC16TargetObjectFile::~PIC16TargetObjectFile() { -#if 0 - for (unsigned i = 0; i < UDATASections_.size(); i++) - delete UDATASections_[i]; - for (unsigned i = 0; i < IDATASections_.size(); i++) - delete IDATASections_[i]; - - delete ROMDATASection_; - for (unsigned i = 0; i < AUTOSections_.size(); i++) - delete AUTOSections_[i]; - - for (unsigned i = 0; i < USERSections_.size(); i++) - delete USERSections_[i]; -#endif -} /// getExplicitSectionGlobal - Allow the target to completely override