1 /* src/vm/jit/alpha/patcher.c - Alpha code patching functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Thalinger
31 $Id: patcher.c 2986 2005-07-11 18:56:09Z twisti $
36 #include "vm/jit/alpha/types.h"
38 #include "mm/memory.h"
39 #include "native/native.h"
40 #include "vm/builtin.h"
42 #include "vm/initialize.h"
43 #include "vm/options.h"
44 #include "vm/references.h"
45 #include "vm/jit/asmpart.h"
46 #include "vm/jit/helper.h"
47 #include "vm/jit/patcher.h"
50 /* patcher_get_putstatic *******************************************************
54 <patched call position>
55 a73bff98 ldq t11,-104(pv)
56 a2590000 ldl a2,0(t11)
58 *******************************************************************************/
60 bool patcher_get_putstatic(u1 *sp)
70 /* get stuff from the stack */
72 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
73 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
74 mcode = *((u4 *) (sp + 2 * 8));
75 uf = (unresolved_field *) *((ptrint *) (sp + 1 * 8));
76 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
78 /* calculate and set the new return address */
81 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
85 /* get the fieldinfo */
87 if (!(fi = helper_resolve_fieldinfo(uf))) {
93 /* check if the field's class is initialized */
95 if (!fi->class->initialized) {
96 if (!initialize_class(fi->class)) {
103 /* patch back original code */
105 *((u4 *) ra) = mcode;
107 /* if we show disassembly, we have to skip the nop */
109 if (opt_showdisassemble)
112 /* get the offset from machine instruction */
114 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
116 /* patch the field value's address */
118 *((ptrint *) (pv + offset)) = (ptrint) &(fi->value);
120 /* synchronize instruction cache */
122 asm_sync_instruction_cache();
124 PATCHER_MARK_PATCHED_MONITOREXIT;
130 /* patcher_get_putfield ********************************************************
134 <patched call position>
135 a2af0020 ldl a5,32(s6)
137 *******************************************************************************/
139 bool patcher_get_putfield(u1 *sp)
142 java_objectheader *o;
144 unresolved_field *uf;
148 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
149 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
150 mcode = *((u4 *) (sp + 2 * 8));
151 uf = (unresolved_field *) *((ptrint *) (sp + 1 * 8));
152 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
154 /* calculate and set the new return address */
157 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
159 PATCHER_MONITORENTER;
161 /* get the fieldinfo */
163 if (!(fi = helper_resolve_fieldinfo(uf))) {
169 /* patch back original code */
171 *((u4 *) ra) = mcode;
173 /* if we show disassembly, we have to skip the nop */
175 if (opt_showdisassemble)
178 /* patch the field's offset */
180 *((u4 *) ra) |= (s2) (fi->offset & 0x0000ffff);
182 /* synchronize instruction cache */
184 asm_sync_instruction_cache();
186 PATCHER_MARK_PATCHED_MONITOREXIT;
192 /* patcher_builtin_new *********************************************************
196 a61bff80 ldq a0,-128(pv)
197 <patched call postition>
198 a77bff78 ldq pv,-136(pv)
201 *******************************************************************************/
203 bool patcher_builtin_new(u1 *sp)
206 java_objectheader *o;
208 constant_classref *cr;
213 /* get stuff from the stack */
215 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
216 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
217 mcode = *((u4 *) (sp + 2 * 8));
218 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
219 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
221 /* calculate and set the new return address */
224 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
226 PATCHER_MONITORENTER;
228 /* get the classinfo */
230 if (!(c = helper_resolve_classinfo(cr))) {
236 /* patch back original code */
238 *((u4 *) (ra + 4)) = mcode;
240 /* get the offset from machine instruction */
242 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
244 /* patch the classinfo pointer */
246 *((ptrint *) (pv + offset)) = (ptrint) c;
248 /* if we show disassembly, we have to skip the nop */
250 if (opt_showdisassemble)
253 /* get the offset from machine instruction */
255 offset = (s2) (*((u4 *) (ra + 4)) & 0x0000ffff);
257 /* patch new function address */
259 *((ptrint *) (pv + offset)) = (ptrint) BUILTIN_new;
261 /* synchronize instruction cache */
263 asm_sync_instruction_cache();
265 PATCHER_MARK_PATCHED_MONITOREXIT;
271 /* patcher_builtin_newarray ****************************************************
275 a63bff88 ldq a1,-120(pv)
276 <patched call position>
277 a77bff80 ldq pv,-128(pv)
280 *******************************************************************************/
282 bool patcher_builtin_newarray(u1 *sp)
285 java_objectheader *o;
287 constant_classref *cr;
292 /* get stuff from the stack */
294 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
295 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
296 mcode = *((u4 *) (sp + 2 * 8));
297 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
298 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
300 /* calculate and set the new return address */
303 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
305 PATCHER_MONITORENTER;
307 /* get the classinfo */
309 if (!(c = helper_resolve_classinfo(cr))) {
315 /* patch back original code */
317 *((u4 *) (ra + 4)) = mcode;
319 /* get the offset from machine instruction */
321 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
323 /* patch the class' vftbl pointer */
325 *((ptrint *) (pv + offset)) = (ptrint) c->vftbl;
327 /* if we show disassembly, we have to skip the nop */
329 if (opt_showdisassemble)
332 /* get the offset from machine instruction */
334 offset = (s2) (*((u4 *) (ra + 4)) & 0x0000ffff);
336 /* patch new function address */
338 *((ptrint *) (pv + offset)) = (ptrint) BUILTIN_newarray;
340 /* synchronize instruction cache */
342 asm_sync_instruction_cache();
344 PATCHER_MARK_PATCHED_MONITOREXIT;
350 /* patcher_builtin_multianewarray **********************************************
354 <patched call position>
355 221f0002 lda a0,2(zero)
356 a63bff80 ldq a1,-128(pv)
358 a77bff78 ldq pv,-136(pv)
361 *******************************************************************************/
363 bool patcher_builtin_multianewarray(u1 *sp)
366 java_objectheader *o;
368 constant_classref *cr;
373 /* get stuff from the stack */
375 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
376 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
377 mcode = *((u4 *) (sp + 2 * 8));
378 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
379 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
381 /* calculate and set the new return address */
384 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
386 PATCHER_MONITORENTER;
388 /* get the classinfo */
390 if (!(c = helper_resolve_classinfo(cr))) {
396 /* patch back original code */
398 *((u4 *) ra) = mcode;
400 /* if we show disassembly, we have to skip the nop */
402 if (opt_showdisassemble)
405 /* get the offset from machine instruction */
407 offset = (s2) (*((u4 *) (ra + 4)) & 0x0000ffff);
409 /* patch the class' vftbl pointer */
411 *((ptrint *) (pv + offset)) = (ptrint) c->vftbl;
413 /* synchronize instruction cache */
415 asm_sync_instruction_cache();
417 PATCHER_MARK_PATCHED_MONITOREXIT;
423 /* patcher_builtin_arraycheckcast **********************************************
427 <patched call position>
428 a63bfe60 ldq a1,-416(pv)
429 a77bfe58 ldq pv,-424(pv)
432 *******************************************************************************/
434 bool patcher_builtin_arraycheckcast(u1 *sp)
437 java_objectheader *o;
439 constant_classref *cr;
444 /* get stuff from the stack */
446 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
447 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
448 mcode = *((u4 *) (sp + 2 * 8));
449 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
450 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
452 /* calculate and set the new return address */
455 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
457 PATCHER_MONITORENTER;
459 /* get the classinfo */
461 if (!(c = helper_resolve_classinfo(cr))) {
467 /* patch back original code */
469 *((u4 *) ra) = mcode;
471 /* if we show disassembly, we have to skip the nop */
473 if (opt_showdisassemble)
476 /* get the offset from machine instruction */
478 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
480 /* patch the class' vftbl pointer */
482 *((ptrint *) (pv + offset)) = (ptrint) c->vftbl;
484 /* get the offset from machine instruction */
486 offset = (s2) (*((u4 *) (ra + 4)) & 0x0000ffff);
488 /* patch new function address */
490 *((ptrint *) (pv + offset)) = (ptrint) BUILTIN_arraycheckcast;
492 /* synchronize instruction cache */
494 asm_sync_instruction_cache();
496 PATCHER_MARK_PATCHED_MONITOREXIT;
502 /* patcher_builtin_arrayinstanceof *********************************************
506 a63bfeb0 ldq a1,-336(pv)
507 <patched call position>
508 a77bfea8 ldq pv,-344(pv)
511 *******************************************************************************/
513 bool patcher_builtin_arrayinstanceof(u1 *sp)
516 java_objectheader *o;
518 constant_classref *cr;
523 /* get stuff from the stack */
525 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
526 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
527 mcode = *((u4 *) (sp + 2 * 8));
528 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
529 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
531 /* calculate and set the new return address */
534 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
536 PATCHER_MONITORENTER;
538 /* get the classinfo */
540 if (!(c = helper_resolve_classinfo(cr))) {
546 /* patch back original code */
548 *((u4 *) (ra + 4)) = mcode;
550 /* get the offset from machine instruction */
552 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
554 /* patch the class' vftbl pointer */
556 *((ptrint *) (pv + offset)) = (ptrint) c->vftbl;
558 /* if we show disassembly, we have to skip the nop */
560 if (opt_showdisassemble)
563 /* get the offset from machine instruction */
565 offset = (s2) (*((u4 *) (ra + 4)) & 0x0000ffff);
567 /* patch new function address */
569 *((ptrint *) (pv + offset)) = (ptrint) BUILTIN_arrayinstanceof;
571 /* synchronize instruction cache */
573 asm_sync_instruction_cache();
575 PATCHER_MARK_PATCHED_MONITOREXIT;
581 /* patcher_invokestatic_special ************************************************
585 <patched call position>
586 a77bffa8 ldq pv,-88(pv)
589 ******************************************************************************/
591 bool patcher_invokestatic_special(u1 *sp)
594 java_objectheader *o;
596 unresolved_method *um;
601 /* get stuff from the stack */
603 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
604 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
605 mcode = *((u4 *) (sp + 2 * 8));
606 um = (unresolved_method *) *((ptrint *) (sp + 1 * 8));
607 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
609 /* calculate and set the new return address */
612 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
614 PATCHER_MONITORENTER;
616 /* get the fieldinfo */
618 if (!(m = helper_resolve_methodinfo(um))) {
624 /* patch back original code */
626 *((u4 *) ra) = mcode;
628 /* if we show disassembly, we have to skip the nop */
630 if (opt_showdisassemble)
633 /* get the offset from machine instruction */
635 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
637 /* patch stubroutine */
639 *((ptrint *) (pv + offset)) = (ptrint) m->stubroutine;
641 /* synchronize instruction cache */
643 asm_sync_instruction_cache();
645 PATCHER_MARK_PATCHED_MONITOREXIT;
651 /* patcher_invokevirtual *******************************************************
655 <patched call position>
656 a7900000 ldq at,0(a0)
657 a77c0100 ldq pv,256(at)
660 *******************************************************************************/
662 bool patcher_invokevirtual(u1 *sp)
665 java_objectheader *o;
667 unresolved_method *um;
670 /* get stuff from the stack */
672 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
673 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
674 mcode = *((u4 *) (sp + 2 * 8));
675 um = (unresolved_method *) *((ptrint *) (sp + 1 * 8));
677 /* calculate and set the new return address */
680 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
682 PATCHER_MONITORENTER;
684 /* get the fieldinfo */
686 if (!(m = helper_resolve_methodinfo(um))) {
692 /* patch back original code */
694 *((u4 *) ra) = mcode;
696 /* if we show disassembly, we have to skip the nop */
698 if (opt_showdisassemble)
701 /* patch vftbl index */
703 *((s4 *) (ra + 4)) |= (s4) ((OFFSET(vftbl_t, table[0]) +
704 sizeof(methodptr) * m->vftblindex) & 0x0000ffff);
706 /* synchronize instruction cache */
708 asm_sync_instruction_cache();
710 PATCHER_MARK_PATCHED_MONITOREXIT;
716 /* patcher_invokeinterface *****************************************************
720 <patched call position>
721 a7900000 ldq at,0(a0)
722 a79cffa0 ldq at,-96(at)
723 a77c0018 ldq pv,24(at)
726 *******************************************************************************/
728 bool patcher_invokeinterface(u1 *sp)
731 java_objectheader *o;
733 unresolved_method *um;
736 /* get stuff from the stack */
738 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
739 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
740 mcode = *((u4 *) (sp + 2 * 8));
741 um = (unresolved_method *) *((ptrint *) (sp + 1 * 8));
743 /* calculate and set the new return address */
746 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
748 PATCHER_MONITORENTER;
750 /* get the fieldinfo */
752 if (!(m = helper_resolve_methodinfo(um))) {
758 /* patch back original code */
760 *((u4 *) ra) = mcode;
762 /* if we show disassembly, we have to skip the nop */
764 if (opt_showdisassemble)
767 /* patch interfacetable index */
769 *((s4 *) (ra + 4)) |= (s4) ((OFFSET(vftbl_t, interfacetable[0]) -
770 sizeof(methodptr*) * m->class->index) & 0x0000ffff);
772 /* patch method offset */
774 *((s4 *) (ra + 4 + 4)) |=
775 (s4) ((sizeof(methodptr) * (m - m->class->methods)) & 0x0000ffff);
777 /* synchronize instruction cache */
779 asm_sync_instruction_cache();
781 PATCHER_MARK_PATCHED_MONITOREXIT;
787 /* patcher_checkcast_instanceof_flags ******************************************
791 <patched call position>
793 *******************************************************************************/
795 bool patcher_checkcast_instanceof_flags(u1 *sp)
798 java_objectheader *o;
800 constant_classref *cr;
805 /* get stuff from the stack */
807 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
808 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
809 mcode = *((u4 *) (sp + 2 * 8));
810 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
811 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
813 /* calculate and set the new return address */
816 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
818 PATCHER_MONITORENTER;
820 /* get the fieldinfo */
822 if (!(c = helper_resolve_classinfo(cr))) {
828 /* patch back original code */
830 *((u4 *) ra) = mcode;
832 /* if we show disassembly, we have to skip the nop */
834 if (opt_showdisassemble)
837 /* get the offset from machine instruction */
839 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
841 /* patch class flags */
843 *((s4 *) (pv + offset)) = (s4) c->flags;
845 /* synchronize instruction cache */
847 asm_sync_instruction_cache();
849 PATCHER_MARK_PATCHED_MONITOREXIT;
855 /* patcher_checkcast_instanceof_interface **************************************
859 <patched call position>
860 a78e0000 ldq at,0(s5)
861 a3bc001c ldl gp,28(at)
862 23bdfffd lda gp,-3(gp)
863 efa0002e ble gp,0x00000200002bf6b0
864 a7bcffe8 ldq gp,-24(at)
866 *******************************************************************************/
868 bool patcher_checkcast_instanceof_interface(u1 *sp)
871 java_objectheader *o;
873 constant_classref *cr;
876 /* get stuff from the stack */
878 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
879 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
880 mcode = *((u4 *) (sp + 2 * 8));
881 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
883 /* calculate and set the new return address */
886 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
888 PATCHER_MONITORENTER;
890 /* get the fieldinfo */
892 if (!(c = helper_resolve_classinfo(cr))) {
898 /* patch back original code */
900 *((u4 *) ra) = mcode;
902 /* if we show disassembly, we have to skip the nop */
904 if (opt_showdisassemble)
907 /* patch super class index */
909 *((s4 *) (ra + 2 * 4)) |= (s4) (-(c->index) & 0x0000ffff);
911 *((s4 *) (ra + 4 * 4)) |= (s4) ((OFFSET(vftbl_t, interfacetable[0]) -
912 c->index * sizeof(methodptr*)) & 0x0000ffff);
914 /* synchronize instruction cache */
916 asm_sync_instruction_cache();
918 PATCHER_MARK_PATCHED_MONITOREXIT;
924 /* patcher_checkcast_instanceof_class ******************************************
928 <patched call position>
929 a7940000 ldq at,0(a4)
930 a7bbff28 ldq gp,-216(pv)
932 *******************************************************************************/
934 bool patcher_checkcast_instanceof_class(u1 *sp)
937 java_objectheader *o;
939 constant_classref *cr;
944 /* get stuff from the stack */
946 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
947 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
948 mcode = *((u4 *) (sp + 2 * 8));
949 cr = (constant_classref *) *((ptrint *) (sp + 1 * 8));
950 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
952 /* calculate and set the new return address */
955 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
957 PATCHER_MONITORENTER;
959 /* get the fieldinfo */
961 if (!(c = helper_resolve_classinfo(cr))) {
967 /* patch back original code */
969 *((u4 *) ra) = mcode;
971 /* if we show disassembly, we have to skip the nop */
973 if (opt_showdisassemble)
976 /* get the offset from machine instruction */
978 offset = (s2) (*((u4 *) (ra + 4)) & 0x0000ffff);
980 /* patch super class' vftbl */
982 *((ptrint *) (pv + offset)) = (ptrint) c->vftbl;
984 /* synchronize instruction cache */
986 asm_sync_instruction_cache();
988 PATCHER_MARK_PATCHED_MONITOREXIT;
994 /* patcher_clinit **************************************************************
998 *******************************************************************************/
1000 bool patcher_clinit(u1 *sp)
1003 java_objectheader *o;
1007 /* get stuff from the stack */
1009 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
1010 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
1011 mcode = *((u4 *) (sp + 2 * 8));
1012 c = (classinfo *) *((ptrint *) (sp + 1 * 8));
1014 /* calculate and set the new return address */
1017 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
1019 PATCHER_MONITORENTER;
1021 /* check if the class is initialized */
1023 if (!c->initialized) {
1024 if (!initialize_class(c)) {
1025 PATCHER_MONITOREXIT;
1031 /* patch back original code */
1033 *((u4 *) ra) = mcode;
1035 /* synchronize instruction cache */
1037 asm_sync_instruction_cache();
1039 PATCHER_MARK_PATCHED_MONITOREXIT;
1045 /* patcher_resolve_native ******************************************************
1049 *******************************************************************************/
1051 #if !defined(ENABLE_STATICVM)
1052 bool patcher_resolve_native(u1 *sp)
1055 java_objectheader *o;
1062 /* get stuff from the stack */
1064 ra = (u1 *) *((ptrint *) (sp + 4 * 8));
1065 o = (java_objectheader *) *((ptrint *) (sp + 3 * 8));
1066 mcode = *((u4 *) (sp + 2 * 8));
1067 m = (methodinfo *) *((ptrint *) (sp + 1 * 8));
1068 pv = (u1 *) *((ptrint *) (sp + 0 * 8));
1070 /* calculate and set the new return address */
1073 *((ptrint *) (sp + 4 * 8)) = (ptrint) ra;
1075 PATCHER_MONITORENTER;
1077 /* resolve native function */
1079 if (!(f = native_resolve_function(m))) {
1080 PATCHER_MONITOREXIT;
1085 /* patch back original code */
1087 *((u4 *) ra) = mcode;
1089 /* if we show disassembly, we have to skip the nop */
1091 if (opt_showdisassemble)
1094 /* get the offset from machine instruction */
1096 offset = (s2) (*((u4 *) ra) & 0x0000ffff);
1098 /* patch native function pointer */
1100 *((ptrint *) (pv + offset)) = (ptrint) f;
1102 /* synchronize instruction cache */
1104 asm_sync_instruction_cache();
1106 PATCHER_MARK_PATCHED_MONITOREXIT;
1110 #endif /* !defined(ENABLE_STATICVM) */
1114 * These are local overrides for various environment variables in Emacs.
1115 * Please do not remove this and leave it at the end of the file, where
1116 * Emacs will automagically detect them.
1117 * ---------------------------------------------------------------------
1120 * indent-tabs-mode: t
1124 * vim:noexpandtab:sw=4:ts=4: