15389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* Copyright (C) 2007-2010 The Android Open Source Project 25389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** 35389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** This software is licensed under the terms of the GNU General Public 45389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** License version 2, as published by the Free Software Foundation, and 55389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** may be copied, distributed, and modified under those terms. 65389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** 75389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** This program is distributed in the hope that it will be useful, 85389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** but WITHOUT ANY WARRANTY; without even the implied warranty of 95389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** GNU General Public License for more details. 115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine*/ 125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* 145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * Contains implementation of class ElfAllocator, that implements memory 155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * allocations for DWARF objects. 165389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine */ 175389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 185389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#include "elf_alloc.h" 195389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#include "elf_file.h" 205389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir ChtchetkineElfAllocator::ElfAllocator() 225389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine : current_chunk_(NULL) { 235389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine} 245389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 255389aa19033153c09556d1362a8b8a56abccb8f5Vladimir ChtchetkineElfAllocator::~ElfAllocator() { 265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine ElfAllocatorChunk* chunk_to_free = current_chunk_; 275389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine while (chunk_to_free != NULL) { 285389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine ElfAllocatorChunk* next_chunk = chunk_to_free->prev; 295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine free(chunk_to_free); 305389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine chunk_to_free = next_chunk; 315389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 325389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine} 335389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinevoid* ElfAllocator::alloc(size_t size) { 355389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine /* Lets keep everyting properly aligned. */ 365389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine size = (size + ELFALLOC_ALIGNMENT_MASK) & ~ELFALLOC_ALIGNMENT_MASK; 375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 385389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (current_chunk_ == NULL || current_chunk_->remains < size) { 395389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine /* Allocate new chunk. */ 405389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine ElfAllocatorChunk* new_chunk = 415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine reinterpret_cast<ElfAllocatorChunk*>(malloc(ELF_ALLOC_CHUNK_SIZE)); 425389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine assert(new_chunk != NULL); 435389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (new_chunk == NULL) { 445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine _set_errno(ENOMEM); 455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine return NULL; 465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine new_chunk->size = ELF_ALLOC_CHUNK_SIZE; 485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine new_chunk->avail = INC_PTR(new_chunk, sizeof(ElfAllocatorChunk)); 495389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine new_chunk->remains = new_chunk->size - sizeof(ElfAllocatorChunk); 505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine new_chunk->prev = current_chunk_; 515389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine current_chunk_ = new_chunk; 525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine void* ret = current_chunk_->avail; 555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine current_chunk_->remains -= size; 565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine current_chunk_->avail = INC_PTR(current_chunk_->avail, size); 575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine return ret; 585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine} 595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 605389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinevoid* DwarfAllocBase::operator new(size_t size, const ElfFile* elf) { 615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine return elf->allocator()->alloc(size); 625389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine} 63