pike.git/
src/
program.c
Branch:
Tag:
Non-build tags
All tags
No tags
2005-05-26
2005-05-26 12:00:56 by Henrik Grubbström (Grubba) <grubba@grubba.org>
7de0a67aea6c9b7330f1a56e7666da79e0c21fc9 (
74
lines) (+
67
/-
7
)
[
Show
|
Annotate
]
Branch:
7.4
Backported use of mexec_* from Pike 7.7.
Rev: src/program.c:1.495
Rev: src/program_areas.h:1.13
2:
|| This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information.
-
|| $Id: program.c,v 1.
494
2005/
03
/
22
11
:
47
:
29
jonasw
Exp $
+
|| $Id: program.c,v 1.
495
2005/
05
/
26
12
:
00
:
56
grubba
Exp $
*/ #include "global.h"
-
RCSID("$Id: program.c,v 1.
494
2005/
03
/
22
11
:
47
:
29
jonasw
Exp $");
+
RCSID("$Id: program.c,v 1.
495
2005/
05
/
26
12
:
00
:
56
grubba
Exp $");
#include "program.h" #include "object.h" #include "dynamic_buffer.h"
796:
#define RELOCATE_constants(ORIG,NEW) #define RELOCATE_relocations(ORIG,NEW)
+
#ifdef PIKE_USE_MACHINE_CODE
+
/* Special cases for low_add_to_program and add_to_program since
+
* many OSes require us to use mmap to allocate memory for our
+
* machine code.
+
*/
+
#define BAR(NUMTYPE,TYPE,NAME) \
+
void PIKE_CONCAT(low_add_to_,NAME) (struct program_state *state, \
+
TYPE ARG) { \
+
if(state->malloc_size_program->PIKE_CONCAT(num_,NAME) == \
+
state->new_program->PIKE_CONCAT(num_,NAME)) { \
+
TYPE *tmp; \
+
state->malloc_size_program->PIKE_CONCAT(num_,NAME) *= 2; \
+
state->malloc_size_program->PIKE_CONCAT(num_,NAME)++; \
+
tmp = mexec_realloc((void *)state->new_program->NAME, \
+
sizeof(TYPE) * \
+
state->malloc_size_program-> \
+
PIKE_CONCAT(num_,NAME)); \
+
if(!tmp) Pike_fatal("Out of memory.\n"); \
+
PIKE_CONCAT(RELOCATE_,NAME)(state->new_program, tmp); \
+
state->new_program->NAME=tmp; \
+
} \
+
state->new_program-> \
+
NAME[state->new_program->PIKE_CONCAT(num_,NAME)++]=(ARG); \
+
} \
+
void PIKE_CONCAT(add_to_,NAME) (TYPE ARG) { \
+
CHECK_FOO(NUMTYPE,TYPE,NAME); \
+
PIKE_CONCAT(low_add_to_,NAME) ( Pike_compiler, ARG ); \
+
}
+
#endif /* PIKE_USE_MACHINE_CODE */
+
#define FOO(NUMTYPE,TYPE,NAME) \ void PIKE_CONCAT(low_add_to_,NAME) (struct program_state *state, \ TYPE ARG) { \
1290:
/* Already done (shouldn't happen, but who knows?) */ if(p->flags & PROGRAM_OPTIMIZED) return;
+
#ifdef PIKE_USE_MACHINE_CODE
+
/* Don't move our mexec-allocated memory into the malloc... */
+
#define BAR(NUMTYPE,TYPE,NAME)
+
#endif /* PIKE_USE_MACHINE_CODE */
+
#define FOO(NUMTYPE,TYPE,NAME) \ size=DO_ALIGN(size, ALIGNOF(TYPE)); \ size+=p->PIKE_CONCAT(num_,NAME)*sizeof(p->NAME[0]);
1304:
size=0;
+
#ifdef PIKE_USE_MACHINE_CODE
+
/* As above. */
+
#define BAR(NUMTYPE,TYPE,NAME)
+
#endif /* PIKE_USE_MACHINE_CODE */
+
#define FOO(NUMTYPE,TYPE,NAME) \ size=DO_ALIGN(size, ALIGNOF(TYPE)); \ MEMCPY(data+size,p->NAME,p->PIKE_CONCAT(num_,NAME)*sizeof(p->NAME[0])); \
1830:
struct inherit i; #define START_SIZE 64
+
#ifdef PIKE_USE_MACHINE_CODE
+
#define BAR(NUMTYPE,TYPE,NAME) \
+
if (Pike_compiler->new_program->NAME) { \
+
mexec_free(Pike_compiler->new_program->NAME); \
+
Pike_compiler->new_program->PIKE_CONCAT(num_,NAME) = 0; \
+
} \
+
Pike_compiler->malloc_size_program->PIKE_CONCAT(num_,NAME) = \
+
START_SIZE; \
+
Pike_compiler->new_program->NAME = \
+
(TYPE *)mexec_alloc(sizeof(TYPE) * START_SIZE);
+
#endif /* PIKE_USE_MACHINE_CODE */
#define FOO(NUMTYPE,TYPE,NAME) \ if (Pike_compiler->new_program->NAME) { \ free (Pike_compiler->new_program->NAME); \
1957:
DOUBLEUNLINK(first_program, p);
+
#if defined(PIKE_USE_MACHINE_CODE) && defined(VALGRIND_DISCARD_TRANSLATIONS)
+
if(p->program) {
+
VALGRIND_DISCARD_TRANSLATIONS(p->program,
+
p->num_program*sizeof(p->program[0]));
+
}
+
#endif /* PIKE_USE_MACHINE_CODE && VALGRIND_DISCARD_TRANSLATIONS */
if(p->flags & PROGRAM_OPTIMIZED) { if(p->program) { #ifdef PIKE_USE_MACHINE_CODE
-
#ifdef
VALGRIND_DISCARD_TRANSLATIONS
-
VALGRIND
_
DISCARD_TRANSLATIONS
(p->program
,
-
p->num_program*sizeof(p->program[0]
)
)
;
-
#
endif
/*
VALGRIND_DISCARD_TRANSLATIONS */
-
#endif /*
PIKE_USE_MACHINE_CODE */
+
mexec
_
free
(p->program);
+
#
else
/* PIKE_USE_MACHINE_CODE */
dmfree(p->program);
-
+
#endif /* PIKE_USE_MACHINE_CODE */
} #define FOO(NUMTYPE,TYPE,NAME) p->NAME=0; #include "program_areas.h" }else{
-
+
#ifdef PIKE_USE_MACHINE_CODE
+
#define BAR(NUMTYPE,TYPE,NAME) \
+
if(p->NAME) { mexec_free((char *)p->NAME); p->NAME=0; }
+
#endif /* PIKE_USE_MACHINE_CODE */
#define FOO(NUMTYPE,TYPE,NAME) \ if(p->NAME) { dmfree((char *)p->NAME); p->NAME=0; } #include "program_areas.h"