Mercurial > projects > ldc
diff lphobos/gc/gclinux.d @ 94:61615fa85940 trunk
[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
Added support for array .sort and .reverse properties.
Fixed some bugs with pointer arithmetic.
Disabled some DMD AST optimizations that was messing things up, destroying valuable information.
Added a KDevelop project file, this is what I use for coding LLVMDC now :)
Other minor stuff.
author | lindquist |
---|---|
date | Mon, 12 Nov 2007 06:32:46 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lphobos/gc/gclinux.d Mon Nov 12 06:32:46 2007 +0100 @@ -0,0 +1,107 @@ + +// Copyright (C) 2001-2004 by Digital Mars, www.digitalmars.com +// All Rights Reserved +// Written by Walter Bright + +import std.c.linux.linuxextern; +import std.c.linux.linux; + +/+ +extern (C) +{ + // from <sys/mman.h> + void* mmap(void* addr, uint len, int prot, int flags, int fd, uint offset); + int munmap(void* addr, uint len); + const void* MAP_FAILED = cast(void*)-1; + + // from <bits/mman.h> + enum { PROT_NONE = 0, PROT_READ = 1, PROT_WRITE = 2, PROT_EXEC = 4 } + enum { MAP_SHARED = 1, MAP_PRIVATE = 2, MAP_TYPE = 0x0F, + MAP_FIXED = 0x10, MAP_FILE = 0, MAP_ANON = 0x20 } +} ++/ + +/*********************************** + * Map memory. + */ + +void *os_mem_map(uint nbytes) +{ void *p; + + //errno = 0; + p = mmap(null, nbytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + return (p == MAP_FAILED) ? null : p; +} + +/*********************************** + * Commit memory. + * Returns: + * 0 success + * !=0 failure + */ + +int os_mem_commit(void *base, uint offset, uint nbytes) +{ + return 0; +} + + +/*********************************** + * Decommit memory. + * Returns: + * 0 success + * !=0 failure + */ + +int os_mem_decommit(void *base, uint offset, uint nbytes) +{ + return 0; +} + +/*********************************** + * Unmap memory allocated with os_mem_map(). + * Returns: + * 0 success + * !=0 failure + */ + +int os_mem_unmap(void *base, uint nbytes) +{ + return munmap(base, nbytes); +} + + +/********************************************** + * Determine "bottom" of stack (actually the top on x86 systems). + */ + +void *os_query_stackBottom() +{ + version (none) + { // See discussion: http://autopackage.org/forums/viewtopic.php?t=22 + static void** libc_stack_end; + + if (libc_stack_end == libc_stack_end.init) + { + void* handle = dlopen(null, RTLD_NOW); + libc_stack_end = cast(void **)dlsym(handle, "__libc_stack_end"); + dlclose(handle); + } + return *libc_stack_end; + } + else + { // This doesn't resolve on all versions of Linux + return __libc_stack_end; + } +} + + +/********************************************** + * Determine base address and size of static data segment. + */ + +void os_query_staticdataseg(void **base, uint *nbytes) +{ + *base = cast(void *)&__data_start; + *nbytes = cast(byte *)&_end - cast(byte *)&__data_start; +}