Commit aa69f64b authored by Chris Toshok's avatar Chris Toshok

only use the mmap/munmap code if we're running in valgrind

parent 24ef9228
...@@ -14,7 +14,9 @@ ...@@ -14,7 +14,9 @@
#include "runtime/ics.h" #include "runtime/ics.h"
#ifndef NVALGRIND
#include <sys/mman.h> #include <sys/mman.h>
#endif
#include "asm_writing/icinfo.h" #include "asm_writing/icinfo.h"
#include "asm_writing/rewriter.h" #include "asm_writing/rewriter.h"
...@@ -28,7 +30,9 @@ ...@@ -28,7 +30,9 @@
#include "core/stats.h" #include "core/stats.h"
#include "core/types.h" #include "core/types.h"
#ifndef NVALGRIND
#define PAGE_SIZE 4096 #define PAGE_SIZE 4096
#endif
namespace pyston { namespace pyston {
...@@ -167,9 +171,13 @@ static void writeTrivialEhFrame(void* eh_frame_addr, void* func_addr, uint64_t f ...@@ -167,9 +171,13 @@ static void writeTrivialEhFrame(void* eh_frame_addr, void* func_addr, uint64_t f
void EHFrameManager::writeAndRegister(void* func_addr, uint64_t func_size) { void EHFrameManager::writeAndRegister(void* func_addr, uint64_t func_size) {
assert(eh_frame_addr == NULL); assert(eh_frame_addr == NULL);
#ifdef NVALGRIND
eh_frame_addr = malloc(EH_FRAME_SIZE);
#else
eh_frame_addr = mmap(NULL, (EH_FRAME_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1), PROT_READ | PROT_WRITE, eh_frame_addr = mmap(NULL, (EH_FRAME_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1), PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
RELEASE_ASSERT(eh_frame_addr != MAP_FAILED, ""); RELEASE_ASSERT(eh_frame_addr != MAP_FAILED, "");
#endif
writeTrivialEhFrame(eh_frame_addr, func_addr, func_size); writeTrivialEhFrame(eh_frame_addr, func_addr, func_size);
// (EH_FRAME_SIZE - 4) to omit the 4-byte null terminator, otherwise we trip an assert in parseEhFrame. // (EH_FRAME_SIZE - 4) to omit the 4-byte null terminator, otherwise we trip an assert in parseEhFrame.
// TODO: can we omit the terminator in general? // TODO: can we omit the terminator in general?
...@@ -180,7 +188,11 @@ void EHFrameManager::writeAndRegister(void* func_addr, uint64_t func_size) { ...@@ -180,7 +188,11 @@ void EHFrameManager::writeAndRegister(void* func_addr, uint64_t func_size) {
EHFrameManager::~EHFrameManager() { EHFrameManager::~EHFrameManager() {
if (eh_frame_addr) { if (eh_frame_addr) {
deregisterEHFrames((uint8_t*)eh_frame_addr, (uint64_t)eh_frame_addr, EH_FRAME_SIZE); deregisterEHFrames((uint8_t*)eh_frame_addr, (uint64_t)eh_frame_addr, EH_FRAME_SIZE);
#ifdef NVALGRIND
free(eh_frame_addr);
#else
munmap(eh_frame_addr, (EH_FRAME_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)); munmap(eh_frame_addr, (EH_FRAME_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1));
#endif
} }
} }
...@@ -233,11 +245,16 @@ RuntimeIC::RuntimeIC(void* func_addr, int num_slots, int slot_size) { ...@@ -233,11 +245,16 @@ RuntimeIC::RuntimeIC(void* func_addr, int num_slots, int slot_size) {
static const int CALL_SIZE = 13; static const int CALL_SIZE = 13;
int patchable_size = num_slots * slot_size; int patchable_size = num_slots * slot_size;
total_size = PROLOGUE_SIZE + patchable_size + CALL_SIZE + EPILOGUE_SIZE;
#ifdef NVALGRIND
int total_size = PROLOGUE_SIZE + patchable_size + CALL_SIZE + EPILOGUE_SIZE;
addr = malloc(total_size);
#else
total_size = PROLOGUE_SIZE + patchable_size + CALL_SIZE + EPILOGUE_SIZE;
addr = mmap(NULL, (total_size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1), PROT_READ | PROT_WRITE | PROT_EXEC, addr = mmap(NULL, (total_size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1), PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
RELEASE_ASSERT(addr != MAP_FAILED, ""); RELEASE_ASSERT(addr != MAP_FAILED, "");
#endif
// printf("Allocated runtime IC at %p\n", addr); // printf("Allocated runtime IC at %p\n", addr);
...@@ -294,7 +311,11 @@ RuntimeIC::RuntimeIC(void* func_addr, int num_slots, int slot_size) { ...@@ -294,7 +311,11 @@ RuntimeIC::RuntimeIC(void* func_addr, int num_slots, int slot_size) {
RuntimeIC::~RuntimeIC() { RuntimeIC::~RuntimeIC() {
if (ENABLE_RUNTIME_ICS) { if (ENABLE_RUNTIME_ICS) {
deregisterCompiledPatchpoint(icinfo.get()); deregisterCompiledPatchpoint(icinfo.get());
#ifdef NVALGRIND
free(addr);
#else
munmap(addr, total_size); munmap(addr, total_size);
#endif
} else { } else {
} }
} }
......
...@@ -35,7 +35,9 @@ public: ...@@ -35,7 +35,9 @@ public:
class RuntimeIC { class RuntimeIC {
private: private:
void* addr; void* addr;
#ifndef NVALGRIND
size_t total_size; size_t total_size;
#endif
EHFrameManager eh_frame; EHFrameManager eh_frame;
std::unique_ptr<ICInfo> icinfo; std::unique_ptr<ICInfo> icinfo;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment