/**-------------------------------------------------------------------** ** CLooG ** **-------------------------------------------------------------------** ** block.c ** **-------------------------------------------------------------------** ** First version: june 11th 2005 ** **-------------------------------------------------------------------**/ /****************************************************************************** * CLooG : the Chunky Loop Generator (experimental) * ****************************************************************************** * * * Copyright (C) 2001-2005 Cedric Bastoul * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * * CLooG, the Chunky Loop Generator * * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * * * ******************************************************************************/ /* CAUTION: the english used for comments is probably the worst you ever read, * please feel free to correct and improve it ! */ # include # include # include "../include/cloog/cloog.h" /****************************************************************************** * Memory leaks hunting * ******************************************************************************/ /** * These functions and global variables are devoted to memory leaks hunting: we * want to know at each moment how many CloogBlock structures had been allocated * (cloog_block_allocated) and how many had been freed (cloog_block_freed). * Each time a CloogBlock structure is allocated, a call to the function * cloog_block_leak_up() must be carried out, and respectively * cloog_block_leak_down() when a CloogBlock structure is freed. The special * variable cloog_block_max gives the maximal number of CloogBlock structures * simultaneously alive (i.e. allocated and non-freed) in memory. * - June 11th 2005: first version. */ static void cloog_block_leak_up(CloogState *state) { state->block_allocated++; if ((state->block_allocated - state->block_freed) > state->block_max) state->block_max = state->block_allocated - state->block_freed; } static void cloog_block_leak_down(CloogState *state) { state->block_freed++; } /****************************************************************************** * Structure display function * ******************************************************************************/ /** * cloog_domain_print_structure : * this function is a human-friendly way to display the CloogDomain data * structure, it includes an indentation level (level) in order to work with * others print_structure functions. * - June 16th 2005: first version. */ void cloog_block_print_structure(FILE * file, CloogBlock * block, int level) { int i ; /* Go to the right level. */ for (i=0; istatement,level+1) ; /* A blank line. */ for (i=0; inb_scaldims == 0) fprintf(file,"No scalar dimensions\n") ; else { fprintf(file,"Scalar dimensions (%d):",block->nb_scaldims) ; for (i = 0; i < block->nb_scaldims; i++) { fprintf(file, " "); cloog_int_print(file, block->scaldims[i]); } fprintf(file,"\n") ; } /* A blank line. */ for (i=0; idepth) ; /* A blank line. */ for (i=0; iblock,1) ; blocklist = blocklist->next ; i++ ; } } /****************************************************************************** * Memory deallocation function * ******************************************************************************/ /** * cloog_block_free function: * This function frees the allocated memory for a CloogStatement structure. * - June 11th 2005: first version. * - June 30th 2005: scaldims field management. */ void cloog_block_free(CloogBlock * block) { int i ; if (block != NULL) { block->references -- ; if (block->references == 0) { cloog_block_leak_down(block->state); if (block->scaldims != NULL) { for (i=0;inb_scaldims;i++) cloog_int_clear(block->scaldims[i]); free(block->scaldims) ; } if (block->statement) cloog_statement_free(block->statement); free(block) ; } } } /** * cloog_block_list_free function: * This function frees the allocated memory for a CloogBlockList structure. * - June 11th 2005: first version. */ void cloog_block_list_free(CloogBlockList * blocklist) { CloogBlockList * temp ; while (blocklist != NULL) { temp = blocklist->next ; cloog_block_free(blocklist->block) ; free(blocklist) ; blocklist = temp ; } } /****************************************************************************** * Processing functions * ******************************************************************************/ /** * cloog_block_malloc function: * This function allocates the memory space for a CloogBlock structure and * sets its fields with default values. Then it returns a pointer to the * allocated space. * - November 21th 2005: first version. */ CloogBlock *cloog_block_malloc(CloogState *state) { CloogBlock * block ; /* Memory allocation for the CloogBlock structure. */ block = (CloogBlock *)malloc(sizeof(CloogBlock)) ; if (block == NULL) cloog_die("memory overflow.\n"); cloog_block_leak_up(state); /* We set the various fields with default values. */ block->state = state; block->statement = NULL ; block->nb_scaldims = 0 ; block->scaldims = NULL ; block->depth = 0 ; block->references = 1 ; block->usr = NULL; return block ; } /** * cloog_block_alloc function: * This function allocates the memory space for a CloogBlock structure and * sets its fields with those given as input. Then it returns a pointer to the * allocated space. The two parameters nb_scaldims and scaldims are for internal * service, put to respectively 0 and NULL if you don't know what they are * useful for ! * - statement is the statement list of the block, * - scattering is the scattering function for the block (NULL if unsure !), * - nb_scaldims is the number of scalar dimensions (0 if unsure !), * - scaldims is the array with the scalar dimensions values (NULL if unsure !), * - depth is the original block depth (the number of outer loops). ** * - June 11th 2005: first version. * - June 30th 2005: addition of the nb_scaldims and scaldims parameters. * - November 21th 2005: use of cloog_block_malloc. */ CloogBlock *cloog_block_alloc(CloogStatement *statement, int nb_scaldims, cloog_int_t *scaldims, int depth) { CloogBlock * block ; /* Block allocation. */ block = cloog_block_malloc(statement->state); block->statement = statement ; block->nb_scaldims = nb_scaldims ; block->scaldims = scaldims ; block->depth = depth ; block->references = 1 ; return block ; } /** * cloog_block_list_malloc function: * This function allocates the memory space for a CloogBlockList structure and * sets its fields with default values. Then it returns a pointer to the * allocated space. * - November 21th 2005: first version. */ CloogBlockList * cloog_block_list_malloc() { CloogBlockList * blocklist ; /* Memory allocation for the CloogBlock structure. */ blocklist = (CloogBlockList *)malloc(sizeof(CloogBlockList)) ; if (blocklist == NULL) cloog_die("memory overflow.\n"); /* We set the various fields with default values. */ blocklist->block = NULL ; blocklist->next = NULL ; return blocklist ; } /** * cloog_block_list_alloc function: * This function allocates the memory space for a CloogBlockList structure and * sets its fields with those given as input. Then it returns a pointer to the * allocated space. * - block is the block element of the list node, ** * - June 11th 2005: first version. * - November 21th 2005: use of cloog_block_list_malloc. */ CloogBlockList * cloog_block_list_alloc(CloogBlock * block) { CloogBlockList * blocklist ; /* Block list node allocation. */ blocklist = cloog_block_list_malloc() ; blocklist->block = block ; blocklist->block->references ++ ; /* The block has a new reference to it. */ blocklist->next = NULL ; return blocklist ; } /** * cloog_block_copy function: * This function returns a copy of a CloogBlock structure 'block'. To save * memory this is not a memory copy but we increment a counter of active * references inside the structure, then return a pointer to that structure. */ CloogBlock * cloog_block_copy(CloogBlock * block) { if (block == NULL) return NULL ; block->references ++ ; return block ; } /** * cloog_block_merge function: * this function adds at the end of the statement list of the block 'block', * the statement list of the block 'merged'. Then the CloogBlock structure * of 'merged' is freed (obviously not its statement list that is now * included in 'block'). * - June 11th 2005: first version. */ void cloog_block_merge(CloogBlock * block, CloogBlock * merged) { CloogStatement * statement ; if ((block == NULL) || (merged == NULL)) return ; if (block->statement != NULL) { statement = block->statement ; while (statement->next != NULL) statement = statement->next ; statement->next = merged->statement ; } else block->statement = merged->statement ; merged->statement = NULL; cloog_block_free(merged); }