From 573eb5e5732534a2ab307b228e1a2fa167157c5b Mon Sep 17 00:00:00 2001 From: Sanjiv Gupta Date: Fri, 8 May 2009 04:50:14 +0000 Subject: [PATCH 1/1] Moved pic16 naming functions to correct place. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71207 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PIC16/PIC16.h | 107 +++++++++++++++++------- lib/Target/PIC16/PIC16MemSelOpt.cpp | 2 +- lib/Target/PIC16/PIC16TargetAsmInfo.cpp | 54 +----------- 3 files changed, 79 insertions(+), 84 deletions(-) diff --git a/lib/Target/PIC16/PIC16.h b/lib/Target/PIC16/PIC16.h index 330bed85ff3..b25b0cc2c18 100644 --- a/lib/Target/PIC16/PIC16.h +++ b/lib/Target/PIC16/PIC16.h @@ -87,46 +87,93 @@ namespace PIC16CC { FRAME_SECTION, AUTOS_SECTION - }; + }; + + inline static const char *getIDName(IDs id) { + switch (id) { + default: assert(0 && "Unknown id"); + case PREFIX_SYMBOL: return "@"; + case FUNC_AUTOS: return ".auto."; + case FUNC_FRAME: return ".frame."; + case FUNC_TEMPS: return ".temp."; + case FUNC_ARGS: return ".args."; + case FUNC_RET: return ".ret."; + case FRAME_SECTION: return "fpdata"; + case AUTOS_SECTION: return "fadata"; + } + } - }; + inline static IDs getID(const std::string &Sym) { + if (Sym.find(getIDName(FUNC_TEMPS))) + return FUNC_TEMPS; + + if (Sym.find(getIDName(FUNC_FRAME))) + return FUNC_FRAME; + + if (Sym.find(getIDName(FUNC_RET))) + return FUNC_RET; + + if (Sym.find(getIDName(FUNC_ARGS))) + return FUNC_ARGS; + + if (Sym.find(getIDName(FUNC_AUTOS))) + return FUNC_AUTOS; + + if (Sym.find(getIDName(LIBCALL))) + return LIBCALL; - inline static const char *getIDName(PIC16ABINames::IDs id) { - switch (id) { - default: assert(0 && "Unknown id"); - case PIC16ABINames::PREFIX_SYMBOL: return "@"; - case PIC16ABINames::FUNC_AUTOS: return ".auto."; - case PIC16ABINames::FUNC_FRAME: return ".frame."; - case PIC16ABINames::FUNC_TEMPS: return ".temp."; - case PIC16ABINames::FUNC_ARGS: return ".args."; - case PIC16ABINames::FUNC_RET: return ".ret."; - case PIC16ABINames::FRAME_SECTION: return "fpdata"; - case PIC16ABINames::AUTOS_SECTION: return "fadata"; + // It does not have any ID. So its a global. + assert (0 && "Could not determine ID symbol type"); } - } - inline static PIC16ABINames::IDs getID(const std::string &Sym) { - if (Sym.find(getIDName(PIC16ABINames::FUNC_TEMPS))) - return PIC16ABINames::FUNC_TEMPS; + // Get func name from a mangled name. + // In all cases func name is the first component before a '.'. + static inline std::string getFuncNameForSym(const std::string &Sym) { + const char *prefix = getIDName (PREFIX_SYMBOL); + + // If this name has a prefix, func name start after prfix in that case. + size_t func_name_start = 0; + if (Sym.find(prefix, 0, strlen(prefix)) != std::string::npos) + func_name_start = strlen(prefix); - if (Sym.find(getIDName(PIC16ABINames::FUNC_FRAME))) - return PIC16ABINames::FUNC_FRAME; + // Position of the . after func name. That's where func name ends. + size_t func_name_end = Sym.find ('.', func_name_start); - if (Sym.find(getIDName(PIC16ABINames::FUNC_RET))) - return PIC16ABINames::FUNC_RET; + return Sym.substr (func_name_start, func_name_end); + } - if (Sym.find(getIDName(PIC16ABINames::FUNC_ARGS))) - return PIC16ABINames::FUNC_ARGS; + // Form a section name given the section type and func name. + static std::string + getSectionNameForFunc (const std::string &Fname, const IDs sec_id) { + std::string sec_id_string = getIDName(sec_id); + return sec_id_string + "." + Fname + ".#"; + } - if (Sym.find(getIDName(PIC16ABINames::FUNC_AUTOS))) - return PIC16ABINames::FUNC_AUTOS; + // Get the section for the given external symbol names. + // This tries to find the type (ID) of the symbol from its mangled name + // and return appropriate section name for it. + static inline std::string getSectionNameForSym(const std::string &Sym) { + std::string SectionName; + + IDs id = getID (Sym); + std::string Fname = getFuncNameForSym (Sym); + + switch (id) { + default : assert (0 && "Could not determine external symbol type"); + case FUNC_FRAME: + case FUNC_RET: + case FUNC_TEMPS: + case FUNC_ARGS: { + return getSectionNameForFunc (Fname, FRAME_SECTION); + } + case FUNC_AUTOS: { + return getSectionNameForFunc (Fname, AUTOS_SECTION); + } + } + } + }; // class PIC16ABINames. - if (Sym.find(getIDName(PIC16ABINames::LIBCALL))) - return PIC16ABINames::LIBCALL; - // It does not have any ID. So its a global. - assert (0 && "Could not determine ID symbol type"); - } inline static const char *PIC16CondCodeToString(PIC16CC::CondCodes CC) { diff --git a/lib/Target/PIC16/PIC16MemSelOpt.cpp b/lib/Target/PIC16/PIC16MemSelOpt.cpp index 0458c5a4174..4edf22ea198 100644 --- a/lib/Target/PIC16/PIC16MemSelOpt.cpp +++ b/lib/Target/PIC16/PIC16MemSelOpt.cpp @@ -145,7 +145,7 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) { // External Symbol is generated for temp data and arguments. They are // in fpdata..# section. std::string Sym = Op.getSymbolName(); - NewBank = getSectionNameForSym(Sym); + NewBank = PIC16ABINames::getSectionNameForSym(Sym); } // If the previous and new section names are same, we don't need to diff --git a/lib/Target/PIC16/PIC16TargetAsmInfo.cpp b/lib/Target/PIC16/PIC16TargetAsmInfo.cpp index 731329e2779..8be9a33b930 100644 --- a/lib/Target/PIC16/PIC16TargetAsmInfo.cpp +++ b/lib/Target/PIC16/PIC16TargetAsmInfo.cpp @@ -192,7 +192,7 @@ void PIC16TargetAsmInfo::SetSectionForGVs(Module &M) { // variable and should not be printed in global data section. std::string name = I->getName(); if (name.find(".auto.") != std::string::npos - || name.find(".arg.") != std::string::npos) + || name.find(".args.") != std::string::npos) continue; int AddrSpace = I->getType()->getAddressSpace(); @@ -202,58 +202,6 @@ void PIC16TargetAsmInfo::SetSectionForGVs(Module &M) { } -// Helper routine. -// Func name starts after prefix and followed by a . -static std::string getFuncNameForSym(const std::string &Sym, - PIC16ABINames::IDs PrefixType) { - - const char *prefix = getIDName (PIC16ABINames::PREFIX_SYMBOL); - - // This name may or may not start with prefix; - // Func names start after prfix in that case. - size_t func_name_start = 0; - if (Sym.find(prefix, 0, strlen(prefix)) != std::string::npos) - func_name_start = strlen(prefix); - - // Position of the . after func name. - size_t func_name_end = Sym.find ('.', func_name_start); - - return Sym.substr (func_name_start, func_name_end); -} - -// Helper routine to create a section name given the section prefix -// and func name. -static std::string -getSectionNameForFunc (const std::string &Fname, - const PIC16ABINames::IDs sec_id) { - std::string sec_id_string = getIDName (sec_id); - return sec_id_string + "." + Fname + ".#"; -} - - -// Get the section for the given external symbol names. -// This function is meant for only mangled external symbol names. -std::string -llvm::getSectionNameForSym(const std::string &Sym) { - std::string SectionName; - - PIC16ABINames::IDs id = getID (Sym); - std::string Fname = getFuncNameForSym (Sym, id); - - switch (id) { - default : assert (0 && "Could not determine external symbol type"); - case PIC16ABINames::FUNC_FRAME: - case PIC16ABINames::FUNC_RET: - case PIC16ABINames::FUNC_TEMPS: - case PIC16ABINames::FUNC_ARGS: { - return getSectionNameForFunc (Fname, PIC16ABINames::FRAME_SECTION); - } - case PIC16ABINames::FUNC_AUTOS: { - return getSectionNameForFunc (Fname, PIC16ABINames::AUTOS_SECTION); - } - } -} - PIC16TargetAsmInfo::~PIC16TargetAsmInfo() { for (unsigned i = 0; i < BSSSections.size(); i++) { -- 2.34.1