Index: m3-sys/m3middle/src/M3CG.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG.m3,v retrieving revision 1.8 diff -u -r1.8 M3CG.m3 --- m3-sys/m3middle/src/M3CG.m3 1 Nov 2010 09:37:23 -0000 1.8 +++ m3-sys/m3middle/src/M3CG.m3 12 Jan 2011 07:22:55 -0000 @@ -151,6 +151,7 @@ compare_exchange := compare_exchange; fence := fence; fetch_and_op := fetch_and_op; + alloca := alloca; END; (*----------------------------------------------------------- ID counters ---*) @@ -935,5 +936,12 @@ xx.child.fetch_and_op (op, t, u, order); END fetch_and_op; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE alloca (xx: T) = + BEGIN + xx.child.alloca (); + END alloca; + BEGIN END M3CG. Index: m3-sys/m3middle/src/M3CG_BinRd.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinRd.m3,v retrieving revision 1.16 diff -u -r1.16 M3CG_BinRd.m3 --- m3-sys/m3middle/src/M3CG_BinRd.m3 16 Nov 2010 09:11:41 -0000 1.16 +++ m3-sys/m3middle/src/M3CG_BinRd.m3 12 Jan 2011 07:22:55 -0000 @@ -197,7 +197,8 @@ Cmd {Bop.fetch_and_sub, fetch_and_sub}, Cmd {Bop.fetch_and_or, fetch_and_or}, Cmd {Bop.fetch_and_and, fetch_and_and}, - Cmd {Bop.fetch_and_xor, fetch_and_xor} + Cmd {Bop.fetch_and_xor, fetch_and_xor}, + Cmd {Bop.alloca, alloca} }; PROCEDURE Inhale (rd: Rd.T; cg: M3CG.T) = @@ -1700,6 +1701,13 @@ fetch_and_op (s, AtomicOp.Xor); END fetch_and_xor; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE alloca (VAR s: State) = + BEGIN + s.cg.alloca (); + END alloca; + BEGIN FOR op := FIRST (CmdMap) TO LAST (CmdMap) DO <*ASSERT CmdMap[op].bop = op *> Index: m3-sys/m3middle/src/M3CG_BinWr.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinWr.m3,v retrieving revision 1.20 diff -u -r1.20 M3CG_BinWr.m3 --- m3-sys/m3middle/src/M3CG_BinWr.m3 20 Nov 2010 13:34:27 -0000 1.20 +++ m3-sys/m3middle/src/M3CG_BinWr.m3 12 Jan 2011 07:22:55 -0000 @@ -178,6 +178,7 @@ compare_exchange := compare_exchange; fence := fence; fetch_and_op := fetch_and_op; + alloca := alloca; END; (*------------------------------------------------------------------- I/O ---*) @@ -1639,5 +1640,12 @@ Int (u, ORD(order)); END fetch_and_op; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE alloca (u: U) = + BEGIN + Cmd (u, Bop.alloca); + END alloca; + BEGIN END M3CG_BinWr. Index: m3-sys/m3middle/src/M3CG_Binary.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Binary.i3,v retrieving revision 1.6 diff -u -r1.6 M3CG_Binary.i3 --- m3-sys/m3middle/src/M3CG_Binary.i3 1 Nov 2010 09:59:44 -0000 1.6 +++ m3-sys/m3middle/src/M3CG_Binary.i3 12 Jan 2011 07:22:55 -0000 @@ -38,7 +38,8 @@ call_indirect, pop_param, pop_struct, pop_static_link, load_procedure, load_static_link, comment, store_ordered, load_ordered, exchange, compare_exchange, fence, - fetch_and_add, fetch_and_sub, fetch_and_or, fetch_and_and, fetch_and_xor + fetch_and_add, fetch_and_sub, fetch_and_or, fetch_and_and, fetch_and_xor, + alloca }; (* Integers are encoded as sequences of unsigned bytes, [0..255]. Index: m3-sys/m3middle/src/M3CG_Check.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Check.m3,v retrieving revision 1.15 diff -u -r1.15 M3CG_Check.m3 --- m3-sys/m3middle/src/M3CG_Check.m3 8 Jan 2011 08:39:05 -0000 1.15 +++ m3-sys/m3middle/src/M3CG_Check.m3 12 Jan 2011 07:22:55 -0000 @@ -23,6 +23,7 @@ VAR (* CONST after "begin_unit" call *) T_to_ST := ARRAY Type OF ST {ST.Void,..}; + ST_Int: ST; CONST ST_name = ARRAY ST OF TEXT { @@ -166,12 +167,11 @@ compare_exchange := compare_exchange; fence := fence; fetch_and_op := fetch_and_op; + alloca := alloca; END; - (*----------------------------------------------- binary/ASCII conversion ---*) - VAR Ints := ARRAY [0..1023] OF TEXT { NIL, .. }; PROCEDURE Int (i: INTEGER): TEXT = @@ -336,8 +336,8 @@ PROCEDURE begin_unit (self: U; optimize : INTEGER) = (* called before any other method to initialize the compilation unit *) CONST IntMap = ARRAY [0..1] OF ST {ST.Int32, ST.Int64}; - VAR ST_Int := IntMap[Target.Integer.bytes DIV 8]; BEGIN + ST_Int := IntMap[Target.Integer.bytes DIV 8]; (* initialize the mapping of stack types *) T_to_ST := ARRAY Type OF ST {ST_Int, ST_Int, ST_Int, ST_Int, (* Word8, Int8, Word16, Int16 *) @@ -1369,5 +1369,14 @@ self.child.fetch_and_op (op, t, u, order); END fetch_and_op; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE alloca (self: U) = + BEGIN + self.child.alloca (); + self.s_pop (ST_Int); + self.s_push (Type.Addr); + END alloca; + BEGIN END M3CG_Check. Index: m3-sys/m3middle/src/M3CG_Ops.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Ops.i3,v retrieving revision 1.11 diff -u -r1.11 M3CG_Ops.i3 --- m3-sys/m3middle/src/M3CG_Ops.i3 1 Nov 2010 09:37:23 -0000 1.11 +++ m3-sys/m3middle/src/M3CG_Ops.i3 12 Jan 2011 07:22:55 -0000 @@ -635,6 +635,11 @@ Mem [s1.A].t := tmp op s0.u; s1.u := tmp; pop *) +(*---------------------------------------------------------------- alloca ---*) + +alloca (); +(* s0.A := alloca(s0.word) *) + END; (* TYPE Public *) END M3CG_Ops. Index: m3-sys/m3middle/src/M3CG_Rd.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Rd.m3,v retrieving revision 1.12 diff -u -r1.12 M3CG_Rd.m3 --- m3-sys/m3middle/src/M3CG_Rd.m3 16 Nov 2010 08:15:16 -0000 1.12 +++ m3-sys/m3middle/src/M3CG_Rd.m3 12 Jan 2011 07:22:56 -0000 @@ -39,7 +39,7 @@ END; CONST - CmdMap = ARRAY [0..159] OF Cmd { + CmdMap = ARRAY [0..160] OF Cmd { Cmd {"begin_unit", begin_unit}, Cmd {"end_unit", end_unit}, Cmd {"import_unit", import_unit}, @@ -199,7 +199,8 @@ Cmd {"fetch_and_sub", fetch_and_sub}, Cmd {"fetch_and_or", fetch_and_or}, Cmd {"fetch_and_and", fetch_and_and}, - Cmd {"fetch_and_xor", fetch_and_xor} + Cmd {"fetch_and_xor", fetch_and_xor}, + Cmd {"alloca", alloca} }; VAR @@ -1821,5 +1822,12 @@ fetch_and_op (s, AtomicOp.Xor); END fetch_and_xor; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE alloca (VAR s: State) = + BEGIN + s.cg.alloca (); + END alloca; + BEGIN END M3CG_Rd. Index: m3-sys/m3middle/src/M3CG_Wr.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Wr.m3,v retrieving revision 1.16 diff -u -r1.16 M3CG_Wr.m3 --- m3-sys/m3middle/src/M3CG_Wr.m3 16 Nov 2010 08:25:24 -0000 1.16 +++ m3-sys/m3middle/src/M3CG_Wr.m3 12 Jan 2011 07:22:56 -0000 @@ -177,8 +177,8 @@ compare_exchange := compare_exchange; fence := fence; fetch_and_op := fetch_and_op; + alloca := alloca; END; - (*------------------------------------------------------------------- I/O ---*) @@ -1790,5 +1790,13 @@ NL (u); END fetch_and_op; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE alloca (u: U) = + BEGIN + Cmd (u, "alloca"); + NL (u); + END alloca; + BEGIN END M3CG_Wr. Index: m3-sys/m3front/src/misc/CG.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/misc/CG.i3,v retrieving revision 1.14 diff -u -r1.14 CG.i3 --- m3-sys/m3front/src/misc/CG.i3 1 Nov 2010 08:35:21 -0000 1.14 +++ m3-sys/m3front/src/misc/CG.i3 12 Jan 2011 07:22:56 -0000 @@ -684,4 +684,8 @@ PROCEDURE Fence (order: MemoryOrder); PROCEDURE Fetch_and_op (op: AtomicOp; t: MType; order: MemoryOrder); +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE Alloca (); + END CG. Index: m3-sys/m3front/src/misc/CG.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/misc/CG.m3,v retrieving revision 1.40 diff -u -r1.40 CG.m3 --- m3-sys/m3front/src/misc/CG.m3 1 Nov 2010 08:35:21 -0000 1.40 +++ m3-sys/m3front/src/misc/CG.m3 12 Jan 2011 07:22:56 -0000 @@ -2702,6 +2702,15 @@ SPush (StackType[t]); END Fetch_and_op; +(*---------------------------------------------------------------- alloca ---*) + +PROCEDURE Alloca () = + BEGIN + Force1 ("Alloca"); + cg.alloca (); + SPush (Type.Addr); + END Alloca; + (*-------------------------------------------------------------- internal ---*) PROCEDURE FixAlign (a: Alignment): Alignment = Index: m3-sys/m3front/src/misc/Marker.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/misc/Marker.m3,v retrieving revision 1.8 diff -u -r1.8 Marker.m3 --- m3-sys/m3front/src/misc/Marker.m3 6 Jan 2011 20:40:16 -0000 1.8 +++ m3-sys/m3front/src/misc/Marker.m3 12 Jan 2011 07:22:56 -0000 @@ -54,7 +54,6 @@ n_frames : INTEGER := 0; save_depth : INTEGER := 0; setjmp : CG.Proc := NIL; - alloca : CG.Proc := NIL; Jumpbuf_size : CG.Var := NIL; tos : INTEGER := 0; stack : ARRAY [0..50] OF Frame; @@ -246,16 +245,6 @@ f := CG.Never); END; END; - (* void* _alloca(size_t); *) - IF (alloca = NIL) THEN - alloca := CG.Import_procedure (M3ID.Add ("_alloca"), 1, CG.Type.Addr, - Target.DefaultCall, new); - IF (new) THEN - EVAL CG.Declare_param (M3ID.NoID, Target.Word.size, Target.Word.align, - Target.Word.cg_type, 0, in_memory := FALSE, - up_level := FALSE, f := CG.Never); - END; - END; (* extern /*const*/ size_t Csetjmp__Jumpbuf_size/* = sizeof(jmp_buf)*/; *) IF (Jumpbuf_size = NIL) THEN Jumpbuf_size := CG.Import_global (M3ID.Add ("Csetjmp__Jumpbuf_size"), @@ -264,10 +253,8 @@ END; (* frame.jmpbuf = alloca(Csetjmp__Jumpbuf_size); *) - CG.Start_call_direct (alloca, 0, Target.Address.cg_type); CG.Load_int (Target.Word.cg_type, Jumpbuf_size); - CG.Pop_param (Target.Word.cg_type); - CG.Call_direct (alloca, Target.Address.cg_type); + CG.Alloca (); CG.Store_addr (frame, M3RT.EF1_jmpbuf); (* setmp(frame.jmpbuf) *) @@ -801,7 +788,6 @@ n_frames := 0; save_depth := 0; setjmp := NIL; - alloca := NIL; Jumpbuf_size := NIL; tos := 0; END Reset; Index: m3-sys/m3back/src/M3C.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3C.m3,v retrieving revision 1.10 diff -u -r1.10 M3C.m3 --- m3-sys/m3back/src/M3C.m3 5 Jan 2011 14:08:19 -0000 1.10 +++ m3-sys/m3back/src/M3C.m3 12 Jan 2011 07:22:56 -0000 @@ -171,6 +171,7 @@ compare_exchange := compare_exchange; fence := fence; fetch_and_op := fetch_and_op; + alloca := alloca; END; (*---------------------------------------------------------------------------*) @@ -2196,5 +2197,14 @@ END; END fetch_and_op; +PROCEDURE alloca (u: U) = + BEGIN + IF u.debug THEN + u.wr.Cmd ("alloca"); + u.wr.NL (); + END; + print(u, "\n/* alloca */\n"); + END alloca; + BEGIN END M3C. Index: m3-sys/m3back/src/M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.191 diff -u -r1.191 M3x86.m3 --- m3-sys/m3back/src/M3x86.m3 1 Nov 2010 09:37:24 -0000 1.191 +++ m3-sys/m3back/src/M3x86.m3 12 Jan 2011 07:22:57 -0000 @@ -213,6 +213,7 @@ compare_exchange := compare_exchange; fence := fence; fetch_and_op := fetch_and_op; + alloca := alloca; END; (*---------------------------------------------------------------------------*) @@ -4608,6 +4609,20 @@ END fetch_and_op; +PROCEDURE alloca (u: U) = + BEGIN + IF u.debug THEN + u.wr.Cmd ("alloca"); + u.wr.NL (); + END; + + <* ASSERT u.in_proc *> + <* ASSERT u.current_proc # NIL *> + + u.vstack.unlock(); + + END alloca; + PROCEDURE Err(t: U; err: TEXT) = BEGIN t.Err(err); Index: m3-sys/m3cggen/src/Main.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cggen/src/Main.m3,v retrieving revision 1.6 diff -u -r1.6 Main.m3 --- m3-sys/m3cggen/src/Main.m3 1 Nov 2010 09:59:44 -0000 1.6 +++ m3-sys/m3cggen/src/Main.m3 12 Jan 2011 07:22:57 -0000 @@ -198,7 +198,8 @@ Desc { "fetch_and_sub", Op.fetch_and_sub }, Desc { "fetch_and_or", Op.fetch_and_or }, Desc { "fetch_and_and", Op.fetch_and_and }, - Desc { "fetch_and_xor", Op.fetch_and_xor } + Desc { "fetch_and_xor", Op.fetch_and_xor }, + Desc { "alloca", Op.alloca } }; PROCEDURE Out (a, b, c, d, e, f, g : TEXT := NIL) = Index: m3-sys/m3cc/gcc/gcc/m3cg/m3-def.h =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cc/gcc/gcc/m3cg/m3-def.h,v retrieving revision 1.9 diff -u -r1.9 m3-def.h --- m3-sys/m3cc/gcc/gcc/m3cg/m3-def.h 15 Nov 2010 10:09:06 -0000 1.9 +++ m3-sys/m3cc/gcc/gcc/m3cg/m3-def.h 12 Jan 2011 07:22:57 -0000 @@ -500,3 +500,4 @@ MTYPE (type1) MTYPE (type2) UNSIGNED_INTEGER (order)) +M3CG (ALLOCA, NOTHING) Index: m3-sys/m3cc/gcc/gcc/m3cg/m3cg.h =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cc/gcc/gcc/m3cg/m3cg.h,v retrieving revision 1.6 diff -u -r1.6 m3cg.h --- m3-sys/m3cc/gcc/gcc/m3cg/m3cg.h 1 Nov 2010 09:59:45 -0000 1.6 +++ m3-sys/m3cc/gcc/gcc/m3cg/m3cg.h 12 Jan 2011 07:22:57 -0000 @@ -164,6 +164,7 @@ M3CG_FETCH_AND_OR, /* 157 */ M3CG_FETCH_AND_AND, /* 158 */ M3CG_FETCH_AND_XOR, /* 159 */ + M3CG_ALLOCA, /* 160 */ LAST_OPCODE } M3CG_opcode; static const char *M3CG_opnames[] = { @@ -327,6 +328,7 @@ "fetch_and_or", /* 157 */ "fetch_and_and", /* 158 */ "fetch_and_xor", /* 159 */ + "alloca", /* 160 */ 0 }; Index: m3-sys/m3cc/gcc/gcc/m3cg/parse.c =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cc/gcc/gcc/m3cg/parse.c,v retrieving revision 1.477 diff -u -r1.477 parse.c --- m3-sys/m3cc/gcc/gcc/m3cg/parse.c 5 Jan 2011 14:34:53 -0000 1.477 +++ m3-sys/m3cc/gcc/gcc/m3cg/parse.c 12 Jan 2011 07:22:58 -0000 @@ -2977,24 +2977,8 @@ m3_convert_function_to_builtin (tree p) { tree *slot = (tree *)htab_find_slot (builtins, p, NO_INSERT); - if (slot) - { p = *slot; - } - else - { - const char *name = IDENTIFIER_POINTER (DECL_NAME (p)); - if (name[0] == 'a' || name[0] == '_') - { - if (strcmp(name, "alloca") == 0 - || strcmp(name, "_alloca") == 0 - || strcmp(name, "__builtin_alloca") == 0) - { - p = built_in_decls[BUILT_IN_ALLOCA]; - } - } - } return p; } @@ -3303,8 +3287,7 @@ m3_start_call (); while (q--) m3_pop_param (t_addr); - tree type = TREE_TYPE (TREE_TYPE (p)); - m3_call_direct (p, type); + m3_call_direct (p, TREE_TYPE (TREE_TYPE (p))); } /*----------------------------------------------------------------------------*/ @@ -5851,6 +5834,13 @@ m3_call_direct (built_in_decls[BUILT_IN_SYNCHRONIZE], t_void); } +M3CG_HANDLER (ALLOCA) +{ + m3_start_call (); + m3_pop_param (t_word); + m3_call_direct (built_in_decls[BUILT_IN_ALLOCA], t_addr); +} + static void m3cg_fetch_and_op (tree type1, tree type2, enum built_in_function fncode) {