[MLton-commit] r7508
Wesley Terpstra
wesley at mlton.org
Sun Mar 20 05:12:18 PST 2011
Incremental patch
----------------------------------------------------------------------
A mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch
----------------------------------------------------------------------
Added: mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch
===================================================================
--- mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch 2011-03-20 13:08:28 UTC (rev 7507)
+++ mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch 2011-03-20 13:12:17 UTC (rev 7508)
@@ -0,0 +1,665 @@
+Description: Accumulatd fixes since last upstream release
+Author: Wesley W. Terpstra (Debian) <terpstra at debian.org>
+Forwarded: no
+Last-Update: 2011-03-20
+
+Index: regression/common-subexp0.ok
+===================================================================
+--- regression/common-subexp0.ok (.../tags/on-20100608-release) (revision 0)
++++ regression/common-subexp0.ok (.../trunk) (revision 7506)
+@@ -0,0 +1 @@
++nan
+Index: regression/weak.3.sml
+===================================================================
+--- regression/weak.3.sml (.../tags/on-20100608-release) (revision 0)
++++ regression/weak.3.sml (.../trunk) (revision 7506)
+@@ -0,0 +1,23 @@
++fun find cache x =
++ case (List.find (fn (y,_) => x = y) (!cache)) of
++ NONE => NONE
++ | SOME (_,r) => SOME r
++fun remove cache x =
++ cache := (List.filter (fn (y,_) => not (x = y)) (!cache))
++fun insert cache (x,r) =
++ cache := (x,r)::(!cache)
++
++val cache = ref []
++
++fun lookup (x : int) =
++ case find cache x of
++ SOME r => (case MLton.Weak.get r of
++ SOME r' => r'
++ | NONE => (remove cache x; lookup x))
++ | NONE => let val res = x + 1
++ val wres = MLton.Weak.new res
++ in insert cache (x, wres);
++ res
++ end
++
++val _ = List.app (fn x => print (concat [Int.toString (lookup x), "\n"])) [5,4,3,2,1]
+Index: regression/weak.3.ok
+===================================================================
+--- regression/weak.3.ok (.../tags/on-20100608-release) (revision 0)
++++ regression/weak.3.ok (.../trunk) (revision 7506)
+@@ -0,0 +1,5 @@
++6
++5
++4
++3
++2
+Index: regression/common-subexp0.sml
+===================================================================
+--- regression/common-subexp0.sml (.../tags/on-20100608-release) (revision 0)
++++ regression/common-subexp0.sml (.../trunk) (revision 7506)
+@@ -0,0 +1,2 @@
++val x = !(ref 0.0) / !(ref 0.0)
++val _ = print (concat [Real.toString x, "\n"])
+Index: regression/real-basic.x86-mingw.ok
+===================================================================
+--- regression/real-basic.x86-mingw.ok (.../tags/on-20100608-release) (revision 0)
++++ regression/real-basic.x86-mingw.ok (.../trunk) (revision 7506)
+@@ -0,0 +1,32 @@
++Real32
++ Reported
++ precision: 24
++ max exponent: 128
++ min exponent: ~125
++ min denormal: ~148
++ Actual
++ precision: 64
++ max exponent: 128
++ min exponent: ~149
++ min denormal: ~149
++ Exported
++ precision: 24
++ max exponent: 128
++ min exponent: ~149
++ min denormal: ~149
++Real64
++ Reported
++ precision: 53
++ max exponent: 1024
++ min exponent: ~1021
++ min denormal: ~1073
++ Actual
++ precision: 64
++ max exponent: 1024
++ min exponent: ~1074
++ min denormal: ~1074
++ Exported
++ precision: 53
++ max exponent: 1024
++ min exponent: ~1074
++ min denormal: ~1074
+Index: runtime/platform/mingw.c
+===================================================================
+--- runtime/platform/mingw.c (.../tags/on-20100608-release) (revision 7506)
++++ runtime/platform/mingw.c (.../trunk) (revision 7506)
+@@ -1308,26 +1308,75 @@
+ }
+ }
+
+-/* The default strerror() does not know extended error codes. */
++static const char *MLton_strerrorExtension(int code) {
++ switch (code) {
++ case EINTR: return "Interrupted function call";
++ case EBADF: return "Bad file descriptor";
++ case EACCES: return "Permission denied";
++ case EFAULT: return "Bad address";
++ case EINVAL: return "Invalid argument";
++ case EMFILE: return "Too many open files";
++ case EAGAIN: return "Resource temporarily unavailable";
++ case EINPROGRESS: return "Operation in progress";
++ case EALREADY: return "Connection already in progress";
++ case ENOTSOCK: return "Not a socket";
++ case EDESTADDRREQ: return "Destination address required";
++ case EMSGSIZE: return "Message too long";
++ case EPROTOTYPE: return "Protocol wrong type for socket";
++ case ENOPROTOOPT: return "Protocol not available";
++ case EPROTONOSUPPORT: return "Protocol not supported";
++ case ESOCKTNOSUPPORT: return "Socket type not supported";
++ case EOPNOTSUPP: return "Operation not supported on socket";
++ case EPFNOSUPPORT: return "Protocol family not supported";
++ case EAFNOSUPPORT: return "Address family not supported";
++ case EADDRINUSE: return "Address already in use";
++ case EADDRNOTAVAIL: return "Address not available";
++ case ENETDOWN: return "Network is down";
++ case ENETUNREACH: return "Network unreachable";
++ case ENETRESET: return "Connection aborted by network";
++ case ECONNABORTED: return "Connection aborted";
++ case ECONNRESET: return "Connection reset";
++ case ENOBUFS: return "No buffer space available";
++ case EISCONN: return "Socket is connected";
++ case ENOTCONN: return "The socket is not connected";
++ case ESHUTDOWN: return "Cannot send after transport endpoint shutdown";
++ case ETIMEDOUT: return "Connection timed out";
++ case ECONNREFUSED: return "Connection refused";
++ case ELOOP: return "Too many levels of symbolic links";
++ case ENAMETOOLONG: return "Filename too long";
++ case EHOSTDOWN: return "Host is down";
++ case EHOSTUNREACH: return "Host is unreachable";
++ case ENOTEMPTY: return "Directory not empty";
++ case EDQUOT: return "Disk quota exceeded";
++ case ESTALE: return "Stale file handle";
++ case EREMOTE: return "Object is remote";
++ case EUSERS: return "Too many users";
++ case ECANCELED: return "Operation canceled";
++ default: return "Unknown error";
++ }
++}
++
++/* MinGW strerror works for all system-defined errno values.
++ * However, platform/mingw.h adds some missing POSIX networking error codes.
++ * It defines these codes as their closest-equivalent winsock error code.
++ * To report network errors, MLton_fixSocketErrno maps winsock errors to
++ * their closest POSIX errno value.
++ *
++ * This function must handle the winsock errno values we have added.
++ * FormatMessage doesn't return the POSIX string for errors, and it uses
++ * the current locale's language. The MinGW strerror is always English.
++ *
++ * Thus, we just make a big English table to augment strerror.
++ * The descriptions are taken from man errno(3).
++ */
+ char *MLton_strerror(int code) {
+- static char buffer[512];
++ static char buffer[80];
+
+- /* Windows specific strerror */
+- if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
+- 0, /* Not used for FROM_SYSTEM */
+- code, /* The status code to look up */
+- 0, /* Use the default language */
+- buffer, /* Write the message to here */
+- sizeof(buffer)-1,
+- 0) == 0) {
+- strcpy(buffer, "Unknown error");
+- }
+-
+- /* Cut message at EOL */
+- for (int i = 0; buffer[i]; ++i)
+- if (buffer[i] == '\n' || buffer[i] == '\r')
+- buffer[i] = 0;
+-
++#undef strerror
++ if (code < sys_nerr) return strerror(code);
++#define strerror MLton_strerror
++
++ strcpy(buffer, MLton_strerrorExtension(code));
+ return buffer;
+ }
+
+Index: mlton/atoms/real-x.fun
+===================================================================
+--- mlton/atoms/real-x.fun (.../tags/on-20100608-release) (revision 7506)
++++ mlton/atoms/real-x.fun (.../trunk) (revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+ * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh
+ * Jagannathan, and Stephen Weeks.
+ *
+@@ -42,9 +42,12 @@
+ | R64 => doit (Real64.fromString, Real64.isFinite, Real64)
+ end
+
+-(* We need to check the sign bit when comparing reals so that we don't treat
+- * 0.0 and ~0.0 identically. The difference between the two is detectable by
+- * user programs that look at the sign bit.
++(* RealX.equals determines if two floating-point constants are equal.
++ * Must check the sign bit, since Real{32,64}.== ignores the sign of
++ * zeros; the difference between 0.0 and ~0.0 is observable by
++ * programs that examine the sign bit.
++ * Must check for nan, since Real{32,64}.== returns false for any
++ * comparison with nan values.
+ *)
+ fun equals (r, r') =
+ case (r, r') of
+@@ -52,13 +55,15 @@
+ let
+ open Real32
+ in
+- equals (r, r') andalso signBit r = signBit r'
++ (equals (r, r') andalso signBit r = signBit r')
++ orelse (isNan r andalso isNan r')
+ end
+ | (Real64 r, Real64 r') =>
+ let
+ open Real64
+ in
+- equals (r, r') andalso signBit r = signBit r'
++ (equals (r, r') andalso signBit r = signBit r')
++ orelse (isNan r andalso isNan r')
+ end
+ | _ => false
+
+Index: mlton/main/main.fun
+===================================================================
+--- mlton/main/main.fun (.../tags/on-20100608-release) (revision 7506)
++++ mlton/main/main.fun (.../trunk) (revision 7506)
+@@ -737,7 +737,7 @@
+ Result.Yes () => ()
+ | Result.No s' => usage (concat ["invalid -ssa2-passes arg: ", s']))
+ | NONE => Error.bug "ssa2 optimization passes missing")),
+- (Normal, "stop", " {f|g|o|sml|tc}", "when to stop",
++ (Normal, "stop", " {f|g|o|tc}", "when to stop",
+ SpaceString
+ (fn s =>
+ stop := (case s of
+Index: mlton/ssa/common-subexp.fun
+===================================================================
+--- mlton/ssa/common-subexp.fun (.../tags/on-20100608-release) (revision 7506)
++++ mlton/ssa/common-subexp.fun (.../trunk) (revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+ * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
+ * Jagannathan, and Stephen Weeks.
+ * Copyright (C) 1997-2000 NEC Research Institute.
+@@ -17,7 +17,7 @@
+ fun eliminate (Program.T {globals, datatypes, functions, main}) =
+ let
+ (* Keep track of control-flow specific cse's,
+- * arguments, and in-degree of blocks.
++ * arguments, and in-degree of blocks.
+ *)
+ val {get = labelInfo: Label.t -> {add: (Var.t * Exp.t) list ref,
+ args: (Var.t * Type.t) vector,
+@@ -33,7 +33,7 @@
+ Property.getSetOnce (Var.plist, Property.initConst NONE)
+ (* Keep track of the variable that holds the length of arrays (and
+ * vectors and strings).
+- *)
++ *)
+ val {get = getLength: Var.t -> Var.t option, set = setLength, ...} =
+ Property.getSetOnce (Var.plist, Property.initConst NONE)
+ fun canonVar x =
+@@ -52,8 +52,8 @@
+ | Const _ => e
+ | PrimApp {prim, targs, args} =>
+ let
+- fun doit args =
+- PrimApp {prim = prim,
++ fun doit args =
++ PrimApp {prim = prim,
+ targs = targs,
+ args = args}
+ val args = canonVars args
+@@ -86,7 +86,7 @@
+ | IntInf_xorb => true
+ | _ => false)
+ then
+- let
++ let
+ val (a0, a1) = canon2 ()
+ in doit (Vector.new3 (a0, a1, arg 2))
+ end
+@@ -103,7 +103,7 @@
+ HashSet.new {hash = #hash}
+ fun lookup (var, exp, hash) =
+ HashSet.lookupOrInsert
+- (table, hash,
++ (table, hash,
+ fn {exp = exp', ...} => Exp.equals (exp, exp'),
+ fn () => {exp = exp,
+ hash = hash,
+@@ -113,9 +113,9 @@
+ (* The hash-cons'ing of globals in ConstantPropagation ensures
+ * that each global is unique.
+ *)
+- val _ =
++ val _ =
+ Vector.foreach
+- (globals, fn Statement.T {var, exp, ...} =>
++ (globals, fn Statement.T {var, exp, ...} =>
+ let
+ val exp = canon exp
+ val _ = lookup (valOf var, exp, Exp.hash exp)
+@@ -138,15 +138,25 @@
+ display (seq [Label.layout label, str ": ", str s])
+ end)
+ val _ = diag "started"
+- val removes = ref []
++ val remove = ref []
+ val {add, ...} = labelInfo label
++ val _ = Control.diagnostics
++ (fn display =>
++ let open Layout
++ in
++ display (seq [str "add: ",
++ List.layout (fn (var,exp) =>
++ seq [Var.layout var,
++ str ": ",
++ Exp.layout exp]) (!add)])
++ end)
+ val _ = List.foreach
+ (!add, fn (var, exp) =>
+ let
+ val hash = Exp.hash exp
+ val elem as {var = var', ...} = lookup (var, exp, hash)
+ val _ = if Var.equals(var, var')
+- then List.push (removes, elem)
++ then List.push (remove, elem)
+ else ()
+ in
+ ()
+@@ -165,18 +175,18 @@
+ in
+ case var of
+ NONE => keep ()
+- | SOME var =>
++ | SOME var =>
+ let
+ fun replace var' =
+ (setReplace (var, SOME var'); NONE)
+ fun doit () =
+ let
+ val hash = Exp.hash exp
+- val elem as {var = var', ...} =
++ val elem as {var = var', ...} =
+ lookup (var, exp, hash)
+ in
+ if Var.equals(var, var')
+- then (List.push (removes, elem)
++ then (List.push (remove, elem)
+ ; keep ())
+ else replace var'
+ end
+@@ -216,14 +226,15 @@
+ val _ = diag "statements"
+ val transfer = Transfer.replaceVar (transfer, canonVar)
+ val transfer =
+- case transfer of
++ case transfer of
+ Arith {prim, args, overflow, success, ...} =>
+ let
+ val {args = succArgs,
+ inDeg = succInDeg,
+- add = succAdd, ...} =
++ add = succAdd, ...} =
+ labelInfo success
+- val {inDeg = overInDeg, add = overAdd, ...} =
++ val {inDeg = overInDeg,
++ add = overAdd, ...} =
+ labelInfo overflow
+ val exp = canon (PrimApp {prim = prim,
+ targs = Vector.new0 (),
+@@ -241,7 +252,7 @@
+ then let
+ val (var', _) =
+ Vector.sub (succArgs, 0)
+- in
++ in
+ setReplace (var', SOME var)
+ end
+ else ()
+@@ -251,7 +262,7 @@
+ then let
+ val (var, _) =
+ Vector.sub (succArgs, 0)
+- in
++ in
+ List.push
+ (succAdd, (var, exp))
+ end
+@@ -284,27 +295,27 @@
+ label = label,
+ statements = statements,
+ transfer = transfer}
++ val _ = List.push (blocks, block)
++ val _ = Vector.foreach (children, loop)
++ val _ = diag "children"
++ val _ = Control.diagnostics
++ (fn display =>
++ let open Layout
++ in
++ display (seq [str "remove: ",
++ List.layout (fn {var,exp,...} =>
++ seq [Var.layout var,
++ str ": ",
++ Exp.layout exp]) (!remove)])
++ end)
++ val _ = List.foreach
++ (!remove, fn {var, hash, ...} =>
++ HashSet.remove
++ (table, hash, fn {var = var', ...} =>
++ Var.equals (var, var')))
++ val _ = diag "removed"
+ in
+- List.push (blocks, block) ;
+- Vector.foreach (children, loop) ;
+- diag "children";
+- Control.diagnostics
+- (fn display =>
+- let open Layout
+- in
+- display (seq [str "removes: ",
+- List.layout (fn {var,exp,...} =>
+- seq [Var.layout var,
+- str ": ",
+- Exp.layout exp]) (!removes)])
+- end);
+- List.foreach
+- (!removes, fn {var, exp, hash} =>
+- HashSet.remove
+- (table, hash, fn {var = var', exp = exp', ...} =>
+- Var.equals (var, var') andalso
+- Exp.equals (exp, exp')));
+- diag "removed"
++ ()
+ end
+ val _ =
+ Control.diagnostics
+@@ -327,7 +338,7 @@
+ val shrink = shrinkFunction {globals = globals}
+ val functions =
+ List.revMap
+- (functions, fn f =>
++ (functions, fn f =>
+ let
+ val {args, blocks, mayInline, name, raises, returns, start} =
+ Function.dest f
+@@ -340,7 +351,7 @@
+ val _ =
+ Vector.foreach
+ (blocks, fn Block.T {transfer, ...} =>
+- Transfer.foreachLabel (transfer, fn label' =>
++ Transfer.foreachLabel (transfer, fn label' =>
+ Int.inc (#inDeg (labelInfo label'))))
+ val blocks = doitTree (Function.dominatorTree f)
+ in
+@@ -352,7 +363,7 @@
+ returns = returns,
+ start = start})
+ end)
+- val program =
++ val program =
+ Program.T {datatypes = datatypes,
+ globals = globals,
+ functions = functions,
+Index: mlton/backend/ssa-to-rssa.fun
+===================================================================
+--- mlton/backend/ssa-to-rssa.fun (.../tags/on-20100608-release) (revision 7506)
++++ mlton/backend/ssa-to-rssa.fun (.../trunk) (revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+ * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh
+ * Jagannathan, and Stephen Weeks.
+ * Copyright (C) 1997-2000 NEC Research Institute.
+@@ -1375,7 +1375,9 @@
+ (CFunction.weakGet
+ {arg = Operand.ty (a 0),
+ return = t}),
+- none)
++ fn () => (case toRtype ty of
++ NONE => none ()
++ | SOME t => move (bogus t)))
+ | Weak_new =>
+ ifIsWeakPointer
+ (ty,
+Index: mlton/elaborate/elaborate-core.fun
+===================================================================
+--- mlton/elaborate/elaborate-core.fun (.../tags/on-20100608-release) (revision 7506)
++++ mlton/elaborate/elaborate-core.fun (.../trunk) (revision 7506)
+@@ -2097,31 +2097,32 @@
+ pats = pats}
+ end))
+ val numArgs =
+- Vector.length (#pats (Vector.sub (rs, 0)))
++ Vector.fold
++ (rs, Vector.length (#pats (Vector.sub (rs, 0))),
++ fn (r,numArgs) =>
++ Int.max (Vector.length (#pats r), numArgs))
+ val argTypes =
+ Vector.tabulate
+ (numArgs, fn i =>
+ let
+- val t =
+- Cpat.ty
+- (#pat (Vector.sub
+- (#pats (Vector.sub (rs, 0)),
+- i)))
++ val t = Type.new ()
+ val _ =
+ Vector.foreach
+ (rs, fn {pats, ...} =>
+- let
+- val {pat, region} =
+- Vector.sub (pats, i)
+- in
+- unify
+- (t, Cpat.ty pat, fn (l1, l2) =>
+- (region,
+- str "function with argument of different types",
+- align [seq [str "argument: ", l2],
+- seq [str "previous: ", l1],
+- lay ()]))
+- end)
++ if Vector.length pats > i
++ then let
++ val {pat, region} =
++ Vector.sub (pats, i)
++ in
++ unify
++ (t, Cpat.ty pat, fn (l1, l2) =>
++ (region,
++ str "function with argument of different types",
++ align [seq [str "argument: ", l2],
++ seq [str "previous: ", l1],
++ lay ()]))
++ end
++ else ())
+ in
+ t
+ end)
+Index: mlton/codegen/amd64-codegen/amd64-generate-transfers.fun
+===================================================================
+--- mlton/codegen/amd64-codegen/amd64-generate-transfers.fun (.../tags/on-20100608-release) (revision 7506)
++++ mlton/codegen/amd64-codegen/amd64-generate-transfers.fun (.../trunk) (revision 7506)
+@@ -1357,6 +1357,31 @@
+ size = pointerSize})),
+ size_stack_args + 32)
+ else (setup_args, size_stack_args)
++ (* SysV ABI AMD64 requires %rax set to the number
++ * of xmms registers passed for varags functions;
++ * since %rax is caller-save, we conservatively
++ * set %rax for all functions (not just varargs).
++ *)
++ val (reg_args, setup_args) =
++ if not win64
++ then let
++ val mem = applyFFTempRegArg 8
++ val reg = Register.rax
++ in
++ ((mem,reg) :: reg_args,
++ AppendList.append
++ (setup_args,
++ AppendList.fromList
++ [Assembly.instruction_mov
++ {src = Operand.immediate_int (List.length xmmreg_args),
++ dst = Operand.memloc mem,
++ size = Size.QUAD},
++ Assembly.directive_cache
++ {caches = [{register = reg,
++ memloc = mem,
++ reserve = true}]}]))
++ end
++ else (reg_args, setup_args)
+ (*
+ val reserve_args =
+ AppendList.fromList
+Index: doc/changelog
+===================================================================
+--- doc/changelog (.../tags/on-20100608-release) (revision 7506)
++++ doc/changelog (.../trunk) (revision 7506)
+@@ -1,3 +1,20 @@
++Here are the changes from version 2010608 to version YYYYMMDD.
++
++* 2011-02-18
++ - Fixed bug with treatment of nan in common subexpression
++ elimination SSA optimization.
++
++* 2011-02-17
++ - Fixed bug in translation from SSA2 to RSSA with weak pointers.
++
++* 2011-02-05
++ - Fixed bug in amd64 codegen calling convention for varargs C calls.
++
++* 2011-01-17
++ - Fixed bug in comment-handling in lexer for mlyacc's input language.
++
++--------------------------------------------------------------------------------
++
+ Here are the changes from version 20070826 to version 20100608.
+
+ Summary:
+Index: lib/mlton/basic/real.sig
+===================================================================
+--- lib/mlton/basic/real.sig (.../tags/on-20100608-release) (revision 7506)
++++ lib/mlton/basic/real.sig (.../trunk) (revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+ * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
+ * Jagannathan, and Stephen Weeks.
+ *
+@@ -60,6 +60,7 @@
+ val input: In0.t -> t
+ val inverse: t -> t
+ val isFinite: t -> bool
++ val isNan: t -> bool
+ val layout: t -> Layout.t
+ val ln: t -> t
+ val log2: t -> t
+Index: mlyacc/src/yacc.lex
+===================================================================
+--- mlyacc/src/yacc.lex (.../tags/on-20100608-release) (revision 7506)
++++ mlyacc/src/yacc.lex (.../trunk) (revision 7506)
+@@ -75,11 +75,11 @@
+ qualid ={id}".";
+ %%
+ <INITIAL>"(*" => (Add yytext; YYBEGIN COMMENT; commentLevel := 1;
+- continue() before YYBEGIN INITIAL);
++ continue(); YYBEGIN INITIAL; continue());
+ <A>"(*" => (YYBEGIN EMPTYCOMMENT; commentLevel := 1; continue());
+ <CODE>"(*" => (Add yytext; YYBEGIN COMMENT; commentLevel := 1;
+- continue() before YYBEGIN CODE);
+-<INITIAL>[^%\013\n]+ => (Add yytext; continue());
++ continue(); YYBEGIN CODE; continue());
++<INITIAL>[^(%\013\n]+ => (Add yytext; continue());
+ <INITIAL>"%%" => (YYBEGIN A; HEADER (concat (rev (!text)),pos yypos,pos yypos));
+ <INITIAL,CODE,COMMENT,F,EMPTYCOMMENT>{eol} => (Add yytext; incLineNum yypos; continue());
+ <INITIAL>. => (Add yytext; continue());
+Index: bin/mlton-script
+===================================================================
+--- bin/mlton-script (.../tags/on-20100608-release) (revision 7506)
++++ bin/mlton-script (.../trunk) (revision 7506)
+@@ -131,6 +131,7 @@
+ -target-link-opt freebsd '-L/usr/local/lib/' \
+ -target-link-opt aix '-maix64' \
+ -target-link-opt ia64 "$ia64hpux" \
++ -target-link-opt linux '-Wl,-znoexecstack' \
+ -target-link-opt mingw \
+ '-lws2_32 -lkernel32 -lpsapi -lnetapi32 -lwinmm' \
+ -target-link-opt mingw '-Wl,--enable-stdcall-fixup' \
More information about the MLton-commit
mailing list