Author: dgilmore Date: 2011-03-12 19:41:50 -0500 (Sat, 12 Mar 2011) New Revision: 3515
Modified: trunk/osprey/be/be/omp_lower.cxx trunk/osprey/be/com/privatize_common.cxx trunk/osprey/be/com/privatize_common.h Log: Fix bug 743 - OpenMP: problem with file static variables that are thread_private. CR: Jian-Xin Lai Modified: trunk/osprey/be/be/omp_lower.cxx =================================================================== --- trunk/osprey/be/be/omp_lower.cxx 2011-03-13 00:36:28 UTC (rev 3514) +++ trunk/osprey/be/be/omp_lower.cxx 2011-03-13 00:41:50 UTC (rev 3515) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Advanced Micro Devices, Inc. All Rights Reserved. + * Copyright (C) 2009-2011 Advanced Micro Devices, Inc. All Rights Reserved. */ /* @@ -296,17 +296,31 @@ Is_True(rename_common_stack.Elements() == 1, ("OMP_Prelower(): rename_common_stack.Elements() != 1")); -# ifdef KEY RENAMING_SCOPE rename_common(NULL, &omp_pool); - RENAMING_SCOPE rename_common_blk(NULL, &omp_pool); + + // Note that rename_common_blk renaming scope needs to provide + // mappings that are valid through the entire compilation. + static RENAMING_SCOPE *rename_common_blk; + if (rename_common_blk == NULL) { + rename_common_blk = CXX_NEW(RENAMING_SCOPE(NULL, Malloc_Mem_Pool), + Malloc_Mem_Pool); + } + else { + std::list<ST*>::const_iterator cit = rename_common_blk->local_mappings.begin(); + + // Remove any mappings local symbols for previously processed PU. + for( ; cit != rename_common_blk->local_mappings.end(); cit++ ) + rename_common_blk->map.Remove(*cit); + rename_common_blk->local_mappings.clear(); + } + RENAMING_STACK rename_scope_stack(&omp_pool); rename_scope_stack.Push(CXX_NEW(RENAMING_SCOPE(NULL, &omp_pool), &omp_pool)); Rename_Threadprivate_COMMON(pu, pu, pu, &rename_scope_stack, &rename_common, - &rename_common_blk); -# endif + rename_common_blk); // create parent map Omp_Parent_Map = WN_MAP_Create(&omp_pool); Modified: trunk/osprey/be/com/privatize_common.cxx =================================================================== --- trunk/osprey/be/com/privatize_common.cxx 2011-03-13 00:36:28 UTC (rev 3514) +++ trunk/osprey/be/com/privatize_common.cxx 2011-03-13 00:41:50 UTC (rev 3515) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Advanced Micro Devices, Inc. All Rights Reserved. + * Copyright (C) 2010-2011 Advanced Micro Devices, Inc. All Rights Reserved. */ /* * Copyright 2004, 2005, 2006 PathScale, Inc. All Rights Reserved. @@ -431,7 +431,7 @@ static ST *Create_Local_Threadprivate_Symbol(ST *old_st) { ST_SCLASS sclass = ST_sclass(old_st); - Is_True(SCLASS_Is_Not_PU_Local(sclass), + Is_True(sclass != SCLASS_AUTO, ("Create_Local_Symbol() called for ST with sclass %d", (INT) sclass ) ); @@ -473,8 +473,9 @@ ST *new_thdprv_st = New_ST(GLOBAL_SYMTAB); - ST_SCLASS sclass = (ST_sclass (old_st) == SCLASS_FSTATIC) ? - SCLASS_FSTATIC : SCLASS_COMMON; + ST_SCLASS sclass = ((ST_sclass (old_st) == SCLASS_FSTATIC + || ST_sclass (old_st) == SCLASS_PSTATIC) ? + SCLASS_FSTATIC : SCLASS_COMMON); TY_IDX old_ty_idx, new_ty_idx; @@ -522,6 +523,10 @@ if (!new_st_for_common_blk) { new_st_for_common_blk = Create_Global_Threadprivate_Symbol(common_block); common_blk_scope->map.Enter(common_block, new_st_for_common_blk); + // Keep track of local symbols, whose mappings need to be removed before + // processing the next PU. + if (ST_IDX_level(ST_st_idx(common_block)) != GLOBAL_SYMTAB) + common_blk_scope->local_mappings.push_front(common_block); } new_st = scope->map.Find(common_block); Modified: trunk/osprey/be/com/privatize_common.h =================================================================== --- trunk/osprey/be/com/privatize_common.h 2011-03-13 00:36:28 UTC (rev 3514) +++ trunk/osprey/be/com/privatize_common.h 2011-03-13 00:41:50 UTC (rev 3515) @@ -1,4 +1,7 @@ /* + * Copyright (C) 2011 Advanced Micro Devices, Inc. All Rights Reserved. + */ +/* * Copyright 2004, 2005, 2006 PathScale, Inc. All Rights Reserved. */ @@ -80,6 +83,7 @@ #include "cxx_hash.h" #endif +#include <list> typedef HASH_TABLE<ST *, ST *> RENAMING_MAP; @@ -96,6 +100,8 @@ ST_SET ignore; // ST's that don't need to be renamed HASH_TABLE<WN *, BOOL> old_prags; // original PRIVATE pragmas in priv_list // for STs that must be renamed + std::list<ST*> local_mappings; // Local symtab table mappings, which need + // to be removed when processing a new PU. RENAMING_SCOPE(WN *_priv_list, MEM_POOL *_pool) : priv_list(_priv_list), pool(_pool), map(NUM_HASH_ELEMENTS, _pool), ignore(NUM_HASH_ELEMENTS, _pool), old_prags(NUM_HASH_ELEMENTS, _pool) ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel