diff options
author | Marcus Arendt <[email protected]> | 2015-01-30 10:15:04 +0100 |
---|---|---|
committer | Marcus Arendt <[email protected]> | 2015-01-30 10:15:04 +0100 |
commit | 3051ca1fa0d27adee5abbccce10351a07ab7daa1 (patch) | |
tree | 42967108495d63a9056cf948c31e623de1c0e76d /erts/emulator/hipe/hipe_amd64.c | |
parent | e4a8ab7530d340249c09ca7f27b0120f55b8354a (diff) | |
parent | 3d41006a0e17d57fef4324c2a49c778f7a4a3390 (diff) | |
download | otp-3051ca1fa0d27adee5abbccce10351a07ab7daa1.tar.gz otp-3051ca1fa0d27adee5abbccce10351a07ab7daa1.tar.bz2 otp-3051ca1fa0d27adee5abbccce10351a07ab7daa1.zip |
Merge branch 'mikpe/hipe-code-alloc-fixes'
* mikpe/hipe-code-alloc-fixes:
hipe: improve error handling at code allocation failure
hipe: remove two obsolete BIFs
hipe: remove HIPE_ALLOC_CODE macro
Diffstat (limited to 'erts/emulator/hipe/hipe_amd64.c')
-rw-r--r-- | erts/emulator/hipe/hipe_amd64.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/erts/emulator/hipe/hipe_amd64.c b/erts/emulator/hipe/hipe_amd64.c index 16c597e7b4..63646825b2 100644 --- a/erts/emulator/hipe/hipe_amd64.c +++ b/erts/emulator/hipe/hipe_amd64.c @@ -125,7 +125,7 @@ static void atexit_alloc_code_stats(void) #define MAP_ANONYMOUS MAP_ANON #endif -static void morecore(unsigned int alloc_bytes) +static int morecore(unsigned int alloc_bytes) { unsigned int map_bytes; char *map_hint, *map_start; @@ -174,10 +174,9 @@ static void morecore(unsigned int alloc_bytes) abort(); } #endif - if (map_start == MAP_FAILED) { - perror("mmap"); - abort(); - } + if (map_start == MAP_FAILED) + return -1; + ALLOC_CODE_STATS(total_mapped += map_bytes); /* Merge adjacent mappings, so the trailing portion of the previous @@ -197,6 +196,8 @@ static void morecore(unsigned int alloc_bytes) } ALLOC_CODE_STATS(atexit_alloc_code_stats()); + + return 0; } static void *alloc_code(unsigned int alloc_bytes) @@ -206,8 +207,8 @@ static void *alloc_code(unsigned int alloc_bytes) /* Align function entries. */ alloc_bytes = (alloc_bytes + 3) & ~3; - if (code_bytes < alloc_bytes) - morecore(alloc_bytes); + if (code_bytes < alloc_bytes && morecore(alloc_bytes) != 0) + return NULL; ALLOC_CODE_STATS(++nr_allocs); ALLOC_CODE_STATS(total_alloc += alloc_bytes); res = code_next; @@ -224,7 +225,6 @@ void *hipe_alloc_code(Uint nrbytes, Eterm callees, Eterm *trampolines, Process * return alloc_code(nrbytes); } - /* Make stub for native code calling exported beam function. */ void *hipe_make_native_stub(void *callee_exp, unsigned int beamArity) @@ -253,6 +253,8 @@ void *hipe_make_native_stub(void *callee_exp, unsigned int beamArity) ((P_CALLEE_EXP + 4) >= 128 ? 3 : 0) + (P_ARITY >= 128 ? 3 : 0); codep = code = alloc_code(codeSize); + if (!code) + return NULL; /* movl $callee_exp, P_CALLEE_EXP(%ebp); 3 or 6 bytes, plus 4 */ codep[0] = 0xc7; |