aboutsummaryrefslogtreecommitdiff
path: root/snug-clean/src/Snug/Compile/ABI.icl
diff options
context:
space:
mode:
Diffstat (limited to 'snug-clean/src/Snug/Compile/ABI.icl')
-rw-r--r--snug-clean/src/Snug/Compile/ABI.icl38
1 files changed, 38 insertions, 0 deletions
diff --git a/snug-clean/src/Snug/Compile/ABI.icl b/snug-clean/src/Snug/Compile/ABI.icl
new file mode 100644
index 0000000..66a8d5c
--- /dev/null
+++ b/snug-clean/src/Snug/Compile/ABI.icl
@@ -0,0 +1,38 @@
+implementation module Snug.Compile.ABI
+
+import StdEnv
+
+import Text
+
+import MIPS.MIPS32
+import Snug.Compile
+
+constructorLabel :: !Namespace !ConstructorIdent -> Label
+constructorLabel "" id = "_c" +++ id // for built-in constructors
+constructorLabel ns id = concat4 "__" (escapeLabel ns) "_c" (escapeLabel id)
+
+functionLabel :: !Namespace !EntryPoint !SymbolIdent -> Label
+functionLabel ns entry_point id
+ | size ns == 0
+ = {#'_',e} +++ escapeLabel id
+ = concat4 "__" (escapeLabel ns) {#'_',e} (escapeLabel id)
+where
+ e = case entry_point of
+ NodeEntry -> 'n'
+
+escapeLabel :: !String -> String
+escapeLabel s = {#c \\ c <- escape [c \\ c <-: s]}
+where
+ escape [] = []
+ escape [c:cs] | isAlphanum c = [c:escape cs]
+ escape ['_':cs] = ['__':escape cs]
+ escape ['`':cs] = ['_B':escape cs]
+ escape [':':cs] = ['_C':escape cs]
+ escape ['.':cs] = ['_D':escape cs]
+ escape ['>':cs] = ['_G':escape cs]
+ escape ['=':cs] = ['_I':escape cs]
+ escape ['<':cs] = ['_L':escape cs]
+ escape ['-':cs] = ['_M':escape cs]
+ escape ['+':cs] = ['_P':escape cs]
+ escape ['\'':cs] = ['_Q':escape cs]
+ escape ['~':cs] = ['_T':escape cs]