diff options
Diffstat (limited to 'src/rt/rust_obstack.cpp')
| -rw-r--r-- | src/rt/rust_obstack.cpp | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/src/rt/rust_obstack.cpp b/src/rt/rust_obstack.cpp deleted file mode 100644 index ec12c8f4554..00000000000 --- a/src/rt/rust_obstack.cpp +++ /dev/null @@ -1,195 +0,0 @@ -// Object stacks, used in lieu of dynamically-sized frames. - -#include <algorithm> -#include <cassert> -#include <cstdlib> -#include <iostream> -#include <new> -#include <stdint.h> - -#include "rust_internal.h" -#include "rust_obstack.h" -#include "rust_shape.h" -#include "rust_task.h" - -// ISAAC, let go of max()! -#ifdef max -#undef max -#endif - -#undef DPRINT -#define DPRINT(fmt, ...) - -const size_t DEFAULT_CHUNK_SIZE = 128; -const size_t MAX_CHUNK_SIZE = (1024*64); -const size_t DEFAULT_ALIGNMENT = 16; - -// A single type-tagged allocation in a chunk. -struct rust_obstack_alloc { - size_t len; - const type_desc *tydesc; - uint32_t pad0; // FIXME: x86-specific - uint32_t pad1; - uint8_t data[]; - - rust_obstack_alloc(size_t in_len, const type_desc *in_tydesc) - : len(in_len), tydesc(in_tydesc) {} -}; - -void * -rust_obstack_chunk::alloc(size_t len, type_desc *tydesc) { - DPRINT("alloc(%lu) alen=%lu size=%lu\n", len, alen, size); - - size_t aligned_alen = align_to(alen, DEFAULT_ALIGNMENT); - size_t end_alen = aligned_alen + sizeof(rust_obstack_alloc) + len; - if (end_alen > size) { - DPRINT("Not enough space, len=%lu alen=%lu aligned=%lu end=%lu!\n", - len, alen, aligned_alen, end_alen); - return NULL; // Not enough space. - } - - rust_obstack_alloc *a = - new(data + aligned_alen) rust_obstack_alloc(len, tydesc); - memset(a->data, '\0', len); // FIXME: For GC. - alen = end_alen; - return &a->data; -} - -bool -rust_obstack_chunk::free(void *ptr) { - uint8_t *p = (uint8_t *)ptr; - if (p < data || p > data + size) - return false; - assert(p <= data + alen); - alen = (size_t)(p - data); - return true; -} - -void * -rust_obstack_chunk::mark() { - uint8_t *m = data + alen; - assert (m >= data && m <= data+size); - return m; -} - -// Allocates the given number of bytes in a new chunk. -void * -rust_obstack::alloc_new(size_t len, type_desc *tydesc) { - size_t default_chunk_size = DEFAULT_CHUNK_SIZE; - if (chunk) { - default_chunk_size = std::min(chunk->size * 2, MAX_CHUNK_SIZE); - } - - size_t chunk_size = std::max(sizeof(rust_obstack_alloc) + len, - default_chunk_size); - void *ptr = task->malloc(sizeof(rust_obstack_chunk) + chunk_size, - "obstack"); - DPRINT("making new chunk at %p, len %lu\n", ptr, chunk_size); - chunk = new(ptr) rust_obstack_chunk(chunk, chunk_size); - return chunk->alloc(len, tydesc); -} - -rust_obstack::~rust_obstack() { - while (chunk) { - rust_obstack_chunk *prev = chunk->prev; - task->free(chunk); - chunk = prev; - } -} - -void * -rust_obstack::alloc(size_t len, type_desc *tydesc) { - if (!chunk) - return alloc_new(len, tydesc); - - void *ptr = chunk->alloc(len, tydesc); - ptr = ptr ? ptr : alloc_new(len, tydesc); - - return ptr; -} - -void -rust_obstack::free(void *ptr) { - if (!ptr) - return; - - assert(chunk); - while (!chunk->free(ptr)) { - DPRINT("deleting chunk at %p (ptr=%p, data=%p-%p)\n", - chunk, ptr, - chunk->data, chunk->data + chunk->size); - rust_obstack_chunk *prev = chunk->prev; - task->free(chunk); - chunk = prev; - assert(chunk); - } -} - -void * -rust_obstack::mark() { - void *m = chunk ? chunk->mark() : NULL; - DPRINT("mark == %p, chunk == %p, data == %p-%p\n", m, chunk, - (chunk ? chunk->data : NULL), - (chunk ? chunk->data + chunk->size : NULL)); - return m; -} - - -// Iteration over self-describing obstacks - -std::pair<const type_desc *,void *> -rust_obstack::iterator::operator*() const { - return std::make_pair(alloc->tydesc, alloc->data); -} - -rust_obstack::iterator & -rust_obstack::iterator::operator++() { - uint8_t *adata = align_to(alloc->data + alloc->len, DEFAULT_ALIGNMENT); - alloc = reinterpret_cast<rust_obstack_alloc *>(adata); - if (reinterpret_cast<uint8_t *>(alloc) >= chunk->data + chunk->alen) { - // We reached the end of this chunk; go on to the next one. - chunk = chunk->prev; - if (chunk) - alloc = reinterpret_cast<rust_obstack_alloc *>(chunk->data); - else - alloc = NULL; - } - return *this; -} - -bool -rust_obstack::iterator::operator==(const rust_obstack::iterator &other) - const { - return chunk == other.chunk && alloc == other.alloc; -} - -bool -rust_obstack::iterator::operator!=(const rust_obstack::iterator &other) - const { - return !(*this == other); -} - - -// Debugging - -void -rust_obstack::dump() const { - iterator b = begin(), e = end(); - while (b != e) { - std::pair<const type_desc *,void *> data = *b; - uint8_t *dp = reinterpret_cast<uint8_t *>(data.second); - - shape::arena arena; - shape::type_param *params = - shape::type_param::from_tydesc_and_data(data.first, dp, arena); - shape::log log(task, true, data.first->shape, params, - data.first->shape_tables, dp, std::cerr); - log.walk(); - std::cerr << "\n"; - - ++b; - } - - std::cerr << "end of dynastack dump\n"; -} - |
