summaryrefslogtreecommitdiff
path: root/lib/Target/PIC16/PIC16.h
diff options
context:
space:
mode:
authorSanjiv Gupta <sanjiv.gupta@microchip.com>2009-05-08 04:50:14 +0000
committerSanjiv Gupta <sanjiv.gupta@microchip.com>2009-05-08 04:50:14 +0000
commit573eb5e5732534a2ab307b228e1a2fa167157c5b (patch)
tree160e3f9555dc44fd2625488c2a7dbbf30dcac520 /lib/Target/PIC16/PIC16.h
parent5877ad7e90de2179c15914ff9e8f1c72152cac30 (diff)
downloadllvm-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.h107
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) {