diff options
author | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2009-05-08 04:50:14 +0000 |
---|---|---|
committer | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2009-05-08 04:50:14 +0000 |
commit | 573eb5e5732534a2ab307b228e1a2fa167157c5b (patch) | |
tree | 160e3f9555dc44fd2625488c2a7dbbf30dcac520 /lib/Target/PIC16/PIC16.h | |
parent | 5877ad7e90de2179c15914ff9e8f1c72152cac30 (diff) | |
download | llvm-573eb5e5732534a2ab307b228e1a2fa167157c5b.tar.gz llvm-573eb5e5732534a2ab307b228e1a2fa167157c5b.tar.bz2 llvm-573eb5e5732534a2ab307b228e1a2fa167157c5b.tar.xz |
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
Diffstat (limited to 'lib/Target/PIC16/PIC16.h')
-rw-r--r-- | lib/Target/PIC16/PIC16.h | 107 |
1 files changed, 77 insertions, 30 deletions
diff --git a/lib/Target/PIC16/PIC16.h b/lib/Target/PIC16/PIC16.h index 330bed85ff..b25b0cc2c1 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) { |