* src/SDCCmain.c (linkEdit): Added runtime path detection to the mcs51 port.
[fw/sdcc] / src / z80 / main.c
index 2a07616fed1889d6e2e66b19d9f6adbac28c6ce0..d2b2639c53a0910b98c9d471a7ad4c42a0a00373 100644 (file)
@@ -151,7 +151,7 @@ _process_pragma (const char *sz)
              wassert (0);
            }
        }
-      gbz80_port.mem.code_name = gc_strdup (buffer);
+      gbz80_port.mem.code_name = Safe_strdup (buffer);
       code->sname = gbz80_port.mem.code_name;
       return 0;
     }
@@ -228,12 +228,12 @@ _parseOptions (int *pargc, char **argv, int *i)
            case 'o':
              /* ROM bank */
              sprintf (buffer, "CODE_%u", bank);
-             gbz80_port.mem.code_name = gc_strdup (buffer);
+             gbz80_port.mem.code_name = Safe_strdup (buffer);
              return TRUE;
            case 'a':
              /* RAM bank */
              sprintf (buffer, "DATA_%u", bank);
-             gbz80_port.mem.data_name = gc_strdup (buffer);
+             gbz80_port.mem.data_name = Safe_strdup (buffer);
              return TRUE;
            }
        }
@@ -271,8 +271,8 @@ _setValues(void)
 {
   if (options.nostdlib == FALSE)
     {
-      setMainValue ("z80libspec", "-k{libdir}/{port} -l{port}.lib");
-      setMainValue ("z80crt0", "{libdir}/{port}/crt0{objext}");
+      setMainValue ("z80libspec", "-k{libdir}{sep}{port} -l{port}.lib");
+      setMainValue ("z80crt0", "{libdir}{sep}{port}{sep}crt0{objext}");
     }
   else
     {
@@ -372,7 +372,7 @@ _mangleSupportFunctionName(char *original)
           options.noRegParams ? "s" : "bds"
           );
 
-  return gc_strdup(buffer);
+  return Safe_strdup(buffer);
 }
 
 static const char *
@@ -386,8 +386,42 @@ _getRegName (struct regs *reg)
   return "err";
 }
 
+static bool
+_hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
+{
+  sym_link *test = NULL;
+  value *val;
+
+  if ( ic->op != '*')
+    {
+      return FALSE;
+    }
+
+  if ( IS_LITERAL (left))
+    {
+      test = left;
+      val = OP_VALUE (IC_LEFT (ic));
+    }
+  else if ( IS_LITERAL (right))
+    {
+      test = left;
+      val = OP_VALUE (IC_RIGHT (ic));
+    }
+  else
+    {
+      return FALSE;
+    }
+
+  if ( getSize (test) <= 2)
+    {
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 #define LINKCMD \
-    "{bindir}/link-{port} -n -c -- {z80bases} -m -j" \
+    "{bindir}{sep}link-{port} -n -c -- {z80bases} -m -j" \
     " {z80libspec}" \
     " {z80extralibfiles} {z80extralibpaths}" \
     " {z80outputtypeflag} {srcfilename}{z80outext}" \
@@ -396,7 +430,7 @@ _getRegName (struct regs *reg)
     " {z80extraobj}" 
 
 #define ASMCMD \
-    "{bindir}/as-{port} -plosgff {srcfilename}{objext} {srcfilename}{asmext}"
+    "{bindir}{sep}as-{port} -plosgff {srcfilename}{objext} {srcfilename}{asmext}"
 
 /* Globals */
 PORT z80_port =
@@ -468,6 +502,7 @@ PORT z80_port =
   _reg_parm,
   _process_pragma,
   _mangleSupportFunctionName,
+  _hasNativeMulFor,
   TRUE,
   0,                           /* leave lt */
   0,                           /* leave gt */
@@ -549,6 +584,7 @@ PORT gbz80_port =
   _reg_parm,
   _process_pragma,
   _mangleSupportFunctionName,
+  _hasNativeMulFor,
   TRUE,
   0,                           /* leave lt */
   0,                           /* leave gt */
@@ -556,6 +592,6 @@ PORT gbz80_port =
   1,                           /* transform >= to ! < */
   1,                           /* transform != to !(a == b) */
   0,                           /* leave == */
-  FALSE,                        /* No array initializer support. */
+  TRUE,                         /* Array initializer support. */
   PORT_MAGIC
 };