summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2003-06-04 19:45:25 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2003-06-04 19:45:25 +0000
commit1d443d125007abc1ee30e4dfe8bdc67b04c66356 (patch)
treeddd936a9d9e429517c508d145270344ad2d06343 /llvm/lib
parent49833da4bf2cdf22d7ee01dc12d5fb76c7f5ca9e (diff)
downloadbcm5719-llvm-1d443d125007abc1ee30e4dfe8bdc67b04c66356.tar.gz
bcm5719-llvm-1d443d125007abc1ee30e4dfe8bdc67b04c66356.zip
* Institute a hack for the Sparc call to mmap() to get our generated code to be
laid out closer to the VM so that calls to library functions (e.g. puts()) and callback (e.g. JITResolver::CompilationCallback) fit into 30 bits of the call instruction. * Abort if architecture is not yet supported (not X86 or Sparc) because it likely requires a different set of parameters to mmap() . * Stop using hard-coded values for page size; use sysconf(_SC_PAGESIZE) instead. llvm-svn: 6610
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/ExecutionEngine/JIT/Emitter.cpp26
1 files changed, 16 insertions, 10 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/Emitter.cpp b/llvm/lib/ExecutionEngine/JIT/Emitter.cpp
index 91fee458ed1..735244f79df 100644
--- a/llvm/lib/ExecutionEngine/JIT/Emitter.cpp
+++ b/llvm/lib/ExecutionEngine/JIT/Emitter.cpp
@@ -67,20 +67,25 @@ MachineCodeEmitter *VM::createEmitter(VM &V) {
// FIXME: This should be rewritten to support a real memory manager for
// executable memory pages!
static void *getMemory(unsigned NumPages) {
+ void *pa;
+ if (NumPages == 0) return 0;
+ static const long pageSize = sysconf(_SC_PAGESIZE);
+
#if defined(i386) || defined(__i386__) || defined(__x86__)
- static const int fd = 0;
+ pa = mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); /* fd = 0 */
#elif defined(sparc) || defined(__sparc__) || defined(__sparcv9)
- static const int fd = -1;
+ static unsigned long Counter = 0;
+ pa = mmap((void*)(0x140000000UL+Counter), pageSize*NumPages,
+ PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_PRIVATE|MAP_ANON|MAP_FIXED, -1, 0); /* fd = -1 */
+ Counter += pageSize*NumPages;
+ std::cerr << "getMemory() returning " << pa << "\n";
#else
- // This is an unsupported architecture.
- static const int fd = 0;
+ std::cerr << "This architecture is not supported by the JIT\n";
+ abort();
#endif
- void *pa;
- if (NumPages == 0) return 0;
- static const long pageSize = sysconf (_SC_PAGESIZE);
- pa = mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,
- MAP_PRIVATE|MAP_ANONYMOUS, fd, 0);
if (pa == MAP_FAILED) {
perror("mmap");
abort();
@@ -118,9 +123,10 @@ void Emitter::emitConstantPool(MachineConstantPool *MCP) {
}
void Emitter::startFunctionStub(const Function &F, unsigned StubSize) {
+ static const long pageSize = sysconf(_SC_PAGESIZE);
SavedCurBlock = CurBlock; SavedCurByte = CurByte;
// FIXME: this is a huge waste of memory.
- CurBlock = (unsigned char *)getMemory((StubSize+4095)/4096);
+ CurBlock = (unsigned char *)getMemory((StubSize+pageSize-1)/pageSize);
CurByte = CurBlock; // Start writing at the beginning of the fn.
}
OpenPOWER on IntegriCloud