Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
clone_DST_utils.cxx
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2 of the GNU General Public License as
00007   published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if 
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU General Public License along
00021   with this program; if not, write the Free Software Foundation, Inc., 59
00022   Temple Place - Suite 330, Boston MA 02111-1307, USA.
00023 
00024   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00025   Mountain View, CA 94043, or:
00026 
00027   http://www.sgi.com
00028 
00029   For further information regarding this notice, see:
00030 
00031   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00032 
00033 */
00034 
00035 
00036 /* -*-Mode: c++;-*- (Tell emacs to use c++ mode) */
00037 
00038 #include "defs.h"
00039 
00040 #include "symtab.h"               // SYMTAB
00041 #include "strtab.h"             // MEM_strtab_pool_ptr
00042 #include "cxx_memory.h"         // CXX_NEW
00043 #include "dwarf_DST.h"          // DST_INFO
00044 #include "dwarf_DST_producer.h" // DST_mk_ functions
00045 #include "dwarf_DST_mem.h"      // DST_IDX, DST_TYPE    
00046 #include "clone.h"              // IPO_SYMTAB
00047 #include "clone_DST_utils.h"    // DST_enter_inline_subroutine
00048 
00049 
00050 INT  num_gen_names = 1;
00051 
00052 #ifndef _LEGO_CLONER
00053 extern MEM_POOL Ipo_mem_pool;
00054 #endif
00055 
00056 const DST_INFO_IDX foreign_origin = DST_FOREIGN_INIT;
00057 
00058 
00059 #define GET_ABSTRACT_ORIGIN(x) ((caller_file_dst == callee_file_dst)? get_abstract_origin(x): foreign_origin)
00060 
00061 
00062 #if !defined(_STANDALONE_INLINER)
00063 static char *
00064 create_ipa_internal_name(void)
00065 {
00066     char *name;
00067 
00068 #if defined(__GNUC__)    
00069     // GNU C/C++ uses a real preprocessor, so we can't put #if inside
00070     // macro arguments.
00071 #if defined(_LEGO_CLONER)
00072     name = (char *) CXX_NEW(char[strlen("***ipa_intnl***")+20],
00073                             MEM_src_pool_ptr);
00074 #else
00075     name = (char *) CXX_NEW(char[strlen("***ipa_intnl***")+20],
00076                             &Ipo_mem_pool);
00077 #endif // _LEGO_CLONER
00078 #else
00079     name = (char *)CXX_NEW(char[strlen("***ipa_intnl***")+20], 
00080 #ifndef _LEGO_CLONER
00081                            &Ipo_mem_pool);
00082 #else
00083                            MEM_src_pool_ptr);
00084 #endif
00085 #endif // __GNUC__
00086 
00087     if (name) 
00088         sprintf(name, "%s_%d", "***ipa_intnl***", num_gen_names++);
00089     return (name);
00090 }
00091 #endif //  !defined(_STANDALONE_INLINER)
00092 
00093 
00094 static DST_IDX
00095 get_abstract_origin(DST_IDX concrete_instance)
00096 {
00097     DST_INFO *dst = DST_INFO_IDX_TO_PTR(concrete_instance);
00098 
00099     if (DST_IS_FOREIGN_OBJ(concrete_instance))
00100         return concrete_instance;
00101 
00102     switch (DST_INFO_tag(dst)) {
00103     case DW_TAG_inlined_subroutine:
00104         {
00105             DST_INLINED_SUBROUTINE *attr =
00106                 DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(dst),
00107                                     DST_INLINED_SUBROUTINE);
00108             if (DST_IS_NULL(DST_INLINED_SUBROUTINE_abstract_origin(attr)))
00109                 return concrete_instance;
00110             else
00111                 return get_abstract_origin(DST_INLINED_SUBROUTINE_abstract_origin(attr));
00112         }
00113 
00114     case DW_TAG_label:
00115         {
00116             DST_LABEL *attr =  DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(dst), DST_LABEL);
00117             if (DST_IS_NULL(DST_LABEL_abstract_origin(attr)))
00118                 return concrete_instance;
00119             else
00120                 return get_abstract_origin(DST_LABEL_abstract_origin(attr));
00121         }
00122 
00123     case DW_TAG_variable:
00124         {
00125             DST_VARIABLE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(dst), DST_VARIABLE);
00126             if (DST_IS_NULL(DST_VARIABLE_def_abstract_origin(attr)))
00127                 return concrete_instance;
00128             else
00129                 return get_abstract_origin(DST_VARIABLE_def_abstract_origin(attr));
00130         }
00131 
00132     case DW_TAG_formal_parameter:
00133         {
00134             DST_FORMAL_PARAMETER *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_FORMAL_PARAMETER);
00135             if (DST_IS_NULL(DST_FORMAL_PARAMETER_abstract_origin(attr)))
00136                 return concrete_instance;
00137             else
00138                 return get_abstract_origin(DST_FORMAL_PARAMETER_abstract_origin(attr));
00139         }
00140 
00141     case DW_TAG_lexical_block:
00142         {
00143             DST_LEXICAL_BLOCK *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_LEXICAL_BLOCK);
00144             if (DST_IS_NULL(DST_LEXICAL_BLOCK_abstract_origin(attr)))
00145                 return concrete_instance;
00146             else
00147                 return get_abstract_origin(DST_LEXICAL_BLOCK_abstract_origin(attr));
00148         }
00149 
00150     case DW_TAG_unspecified_parameters:
00151         {
00152             DST_UNSPECIFIED_PARAMETERS *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_UNSPECIFIED_PARAMETERS);
00153             if (DST_IS_NULL(DST_UNSPECIFIED_PARAMETERS_abstract_origin(attr)))
00154                 return concrete_instance;
00155             else
00156                 return get_abstract_origin(DST_UNSPECIFIED_PARAMETERS_abstract_origin(attr));
00157         }
00158 
00159     case DW_TAG_typedef:
00160         {
00161             DST_TYPEDEF *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_TYPEDEF);
00162             if (DST_IS_NULL(DST_TYPEDEF_abstract_origin(attr)))
00163                 return concrete_instance;
00164             else
00165                 return get_abstract_origin(DST_TYPEDEF_abstract_origin(attr));
00166         }
00167 
00168     case DW_TAG_array_type:
00169         {
00170             DST_ARRAY_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_ARRAY_TYPE);
00171             if (DST_IS_NULL(DST_ARRAY_TYPE_abstract_origin(attr)))
00172                 return concrete_instance;
00173             else
00174                 return get_abstract_origin(DST_ARRAY_TYPE_abstract_origin(attr));
00175         }
00176 
00177     case DW_TAG_structure_type:
00178         {
00179             DST_STRUCTURE_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_STRUCTURE_TYPE);
00180             if (DST_IS_NULL(DST_STRUCTURE_TYPE_abstract_origin(attr)))
00181                 return concrete_instance;
00182             else
00183                 return get_abstract_origin(DST_STRUCTURE_TYPE_abstract_origin(attr));
00184         }
00185 
00186     case DW_TAG_union_type:
00187         {
00188             DST_UNION_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_UNION_TYPE);
00189             if (DST_IS_NULL(DST_UNION_TYPE_abstract_origin(attr)))
00190                 return concrete_instance;
00191             else
00192                 return get_abstract_origin(DST_UNION_TYPE_abstract_origin(attr));
00193         }
00194 
00195     case DW_TAG_class_type:
00196         {
00197             DST_CLASS_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_CLASS_TYPE);
00198             if (DST_IS_NULL(DST_CLASS_TYPE_abstract_origin(attr)))
00199                 return concrete_instance;
00200             else
00201                 return get_abstract_origin(DST_CLASS_TYPE_abstract_origin(attr));
00202         }
00203 
00204     case DW_TAG_enumeration_type:
00205         {
00206             DST_ENUMERATION_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_ENUMERATION_TYPE);
00207             if (DST_IS_NULL(DST_ENUMERATION_TYPE_abstract_origin(attr)))
00208                 return concrete_instance;
00209             else
00210                 return get_abstract_origin(DST_ENUMERATION_TYPE_abstract_origin(attr));
00211         }
00212 
00213     case DW_TAG_subroutine_type:
00214         {
00215             DST_SUBROUTINE_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (dst), DST_SUBROUTINE_TYPE);
00216             if (DST_IS_NULL(DST_SUBROUTINE_TYPE_abstract_origin(attr)))
00217                 return concrete_instance;
00218             else
00219                 return get_abstract_origin(DST_SUBROUTINE_TYPE_abstract_origin(attr));
00220         }
00221 
00222     }
00223 
00224     return concrete_instance;
00225 }
00226 
00227 
00228 
00229 static void
00230 DST_enter_cloned_childs(DST_IDX parent, 
00231                         DST_IDX inl_routine, 
00232                         IPO_SYMTAB *symtab, 
00233                         DST_TYPE caller_file_dst, 
00234                         DST_TYPE callee_file_dst, 
00235                         mUINT16 parent_file_index, 
00236                         BOOL inlined,
00237                         MEM_POOL *caller_file_m,
00238                         MEM_POOL *callee_file_m)
00239 {
00240     DST_INFO_IDX child_idx;
00241     USRCPOS decl;
00242 
00243     USRCPOS_clear(decl);
00244     /* set Current_Symtab to callee's symtab so that St_Table would
00245      * work properly
00246      */
00247     Scope_tab = symtab->Get_orig_scope_tab();
00248     CURRENT_SYMTAB = symtab->Get_orig_level();
00249 
00250     /* go down all the child of the current DST and 
00251      * generate appropiate entries for that in the concrete instance
00252      */
00253 #if (!defined(_LEGO_CLONER))
00254             Current_DST = callee_file_dst;
00255 #endif
00256     for (child_idx = DST_first_child(inl_routine); !DST_IS_NULL(child_idx);
00257                 child_idx = DST_INFO_sibling(DST_INFO_IDX_TO_PTR(child_idx))) {
00258         DST_INFO_IDX idx;
00259 
00260         switch (DST_INFO_tag(DST_INFO_IDX_TO_PTR(child_idx))) {
00261         case DW_TAG_formal_parameter: 
00262             {
00263             /* take care of formal parameters here */
00264             ST *param_st;
00265             DST_ASSOC_INFO parm;
00266 
00267 #if (!defined(_LEGO_CLONER))
00268             Current_DST = callee_file_dst;
00269 #endif
00270 
00271             DST_FORMAL_PARAMETER *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_FORMAL_PARAMETER);
00272 
00273             param_st = symtab->Get_Cloned_ST(&St_Table[
00274                 DST_ASSOC_INFO_st_idx(DST_FORMAL_PARAMETER_st (attr))]);
00275 
00276             if (param_st) {
00277                 char *name = NULL;
00278                 DST_ASSOC_INFO_st_idx(parm) = ST_st_idx(param_st);
00279                 decl = DST_FORMAL_PARAMETER_decl(attr);
00280 
00281                 name = DST_STR_IDX_TO_PTR(DST_FORMAL_PARAMETER_name(attr));
00282 #if (!defined(_LEGO_CLONER))
00283                 Current_DST = caller_file_dst;
00284 #endif
00285                 if (parent_file_index)
00286                     USRCPOS_filenum(decl) = parent_file_index;
00287 
00288                 idx = DST_mk_formal_parameter(decl,
00289                                           name,
00290                                           DST_INVALID_IDX,
00291                                           (void *)&parm, /* for location */
00292                                           GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00293                                           DST_INVALID_IDX,
00294                                           FALSE,
00295                                           FALSE,
00296                                           FALSE, // is_artificial
00297                                           FALSE); // is_declaration_only
00298                 DST_append_child(parent, idx);
00299             }
00300             break;
00301             }
00302         case DW_TAG_variable:
00303             {
00304             if (!(DST_IS_declaration(DST_INFO_flag(DST_INFO_IDX_TO_PTR(child_idx)))) &&
00305                 DST_IS_automatic(DST_INFO_flag(DST_INFO_IDX_TO_PTR(child_idx)))) {
00306                 /* Take care of local variables here */
00307 
00308                 ST *local_st;
00309                 DST_ASSOC_INFO var;
00310 
00311 #if (!defined(_LEGO_CLONER))
00312                 Current_DST = callee_file_dst;
00313 #endif
00314 
00315                 DST_VARIABLE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(DST_INFO_IDX_TO_PTR(child_idx)), DST_VARIABLE);
00316 
00317                 local_st = symtab->Get_Cloned_ST(&St_Table[
00318                         DST_ASSOC_INFO_st_idx(DST_VARIABLE_def_st (attr))]);
00319                 if (local_st) {
00320                     char *name = NULL;
00321 
00322                     DST_ASSOC_INFO_st_idx(var) = ST_st_idx(local_st);
00323 
00324                     decl = DST_VARIABLE_constant_decl(attr);
00325 
00326                     name = DST_STR_IDX_TO_PTR(DST_VARIABLE_def_name(attr));
00327 #if (!defined(_LEGO_CLONER))
00328                     Current_DST = caller_file_dst;
00329 #endif
00330                     if (parent_file_index)
00331                         USRCPOS_filenum(decl) = parent_file_index;
00332 
00333                     idx = DST_mk_variable(decl,
00334                                 name,
00335                                 DST_INVALID_IDX,
00336                                 0,
00337                                 (void*)&var,     /* for location    */
00338                                 GET_ABSTRACT_ORIGIN(child_idx),         /* abstract_origin */
00339                                 FALSE,
00340                                 FALSE,
00341                                 FALSE,
00342                                 FALSE);
00343                     DST_append_child(parent, idx);
00344                 }
00345             }
00346             break;
00347             }
00348         case DW_TAG_label:
00349             {
00350             DST_ASSOC_INFO lbl;
00351             char *label_name = NULL;
00352 
00353 #if (!defined(_LEGO_CLONER))
00354             Current_DST = callee_file_dst;
00355 #endif
00356 
00357             DST_LABEL *attr =  DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(DST_INFO_IDX_TO_PTR(child_idx)), DST_LABEL);
00358 
00359             DST_ASSOC_INFO_st_idx(lbl) = make_ST_IDX(
00360                 DST_ASSOC_INFO_st_index(DST_LABEL_low_pc (attr)) 
00361                         + symtab->Get_cloned_label_last_idx(),
00362                 symtab->Get_cloned_level() );
00363 
00364 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00365 
00366             if (DST_IS_NULL(DST_LABEL_name(attr))) {
00367                 label_name = create_ipa_internal_name();
00368                 if (label_name) {
00369                     /* we need to fix up the callee's label name also */
00370                     MEM_POOL *old_src_pool = MEM_src_pool_ptr;
00371                     if (inlined && (caller_file_m != callee_file_m)) {
00372                         MEM_src_pool_ptr = callee_file_m;
00373                     }
00374                     DST_label_add_name(attr, label_name);
00375                     MEM_src_pool_ptr = old_src_pool;
00376                 }
00377             }
00378             else 
00379                  label_name = DST_STR_IDX_TO_PTR(DST_LABEL_name(attr));
00380             Current_DST = caller_file_dst;
00381 #endif
00382 
00383             idx = DST_mk_label(label_name, (void *)&lbl, 
00384                                         GET_ABSTRACT_ORIGIN(child_idx));
00385 
00386             DST_append_child(parent, idx);
00387             break;
00388             }
00389         /* take care of nested inline subroutines */
00390         case DW_TAG_inlined_subroutine:
00391             {
00392             /* what we are looking here is a concrete instance already */
00393 #if (!defined(_LEGO_CLONER))
00394             Current_DST = callee_file_dst;
00395 #endif
00396 
00397             DST_INLINED_SUBROUTINE *attr =  DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(DST_INFO_IDX_TO_PTR(child_idx)), DST_INLINED_SUBROUTINE);
00398 
00399             LABEL_IDX b_lbl = DST_ASSOC_INFO_st_index(DST_INLINED_SUBROUTINE_low_pc (attr)) +  symtab->Get_cloned_label_last_idx();
00400             LABEL_IDX e_lbl = DST_ASSOC_INFO_st_index(DST_INLINED_SUBROUTINE_high_pc (attr)) +  symtab->Get_cloned_label_last_idx();
00401 
00402             (void)DST_enter_inlined_subroutine(parent,
00403                              child_idx,
00404                              b_lbl,
00405                              e_lbl,             
00406                              caller_file_dst,
00407                              callee_file_dst,
00408                              symtab,
00409                              caller_file_m,
00410                              callee_file_m,
00411                              parent_file_index);
00412             break;
00413             }
00414         case DW_TAG_lexical_block:
00415             {
00416             DST_ASSOC_INFO low_pc;
00417             DST_ASSOC_INFO high_pc;
00418 
00419 #if (!defined(_LEGO_CLONER))
00420             Current_DST = callee_file_dst;
00421 #endif
00422 
00423             DST_LEXICAL_BLOCK *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(DST_INFO_IDX_TO_PTR(child_idx)), DST_LEXICAL_BLOCK);
00424 
00425             DST_ASSOC_INFO_st_idx(low_pc)  = make_ST_IDX(
00426                 DST_ASSOC_INFO_st_index(DST_LEXICAL_BLOCK_low_pc (attr)) 
00427                         + symtab->Get_cloned_label_last_idx(),
00428                 symtab->Get_cloned_level() );
00429 
00430             DST_ASSOC_INFO_st_idx(high_pc)  = make_ST_IDX(
00431                 DST_ASSOC_INFO_st_index(DST_LEXICAL_BLOCK_high_pc (attr)) 
00432                         + symtab->Get_cloned_label_last_idx(),
00433                 symtab->Get_cloned_level() );
00434 
00435             char *block_name = NULL;
00436 
00437 #if ( !defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00438 
00439             if (DST_IS_NULL(DST_LEXICAL_BLOCK_name(attr))) {
00440                 block_name = create_ipa_internal_name();
00441                 if (block_name) {
00442                     /* we need to fix up the callee's lexical_block name also */
00443                     MEM_POOL *old_src_pool = MEM_src_pool_ptr;
00444                     if (inlined && (caller_file_m != callee_file_m)) {
00445                         MEM_src_pool_ptr = callee_file_m;
00446                     }
00447                     DST_lexical_block_add_name(attr, block_name);
00448                     MEM_src_pool_ptr = old_src_pool;
00449                 }
00450             }
00451             else 
00452                 block_name = DST_STR_IDX_TO_PTR(DST_LEXICAL_BLOCK_name(attr));
00453             Current_DST = caller_file_dst;
00454 #endif
00455 
00456             idx = DST_mk_lexical_block(block_name,
00457                              (void *) &low_pc,
00458                              (void *) &high_pc,
00459                              GET_ABSTRACT_ORIGIN(child_idx));
00460 
00461             DST_append_child(parent, idx);
00462 
00463             (void)DST_enter_cloned_childs(idx, child_idx, 
00464                         symtab, caller_file_dst, callee_file_dst, 
00465                         parent_file_index, inlined, caller_file_m, callee_file_m);
00466 
00467            break;
00468            }
00469 
00470         case DW_TAG_unspecified_parameters:
00471             {
00472             if (inlined) 
00473                 break;
00474             else {
00475 #if (!defined(_LEGO_CLONER))
00476             Current_DST = callee_file_dst;
00477 #endif
00478                 DST_UNSPECIFIED_PARAMETERS *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_UNSPECIFIED_PARAMETERS);
00479 
00480 #if (!defined(_LEGO_CLONER))
00481                 Current_DST = caller_file_dst;
00482 #endif
00483 
00484                 idx = DST_mk_unspecified_parameters(
00485                     DST_UNSPECIFIED_PARAMETERS_decl(attr),
00486                     GET_ABSTRACT_ORIGIN(child_idx));     /* abstract_origin */
00487 
00488                 DST_append_child(parent, idx);
00489                 break;
00490             }
00491             }
00492     
00493         case DW_TAG_typedef:
00494             {
00495             if (inlined) 
00496                 break;
00497             else {
00498 #if (!defined(_LEGO_CLONER))
00499                 Current_DST = callee_file_dst;
00500 #endif
00501 
00502                 DST_TYPEDEF *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_TYPEDEF);
00503 
00504 #if (!defined(_LEGO_CLONER))
00505                 Current_DST = caller_file_dst;
00506 #endif
00507 
00508                 idx = DST_mk_typedef(
00509                     DST_TYPEDEF_decl(attr),
00510                     NULL,
00511                     DST_TYPEDEF_type(attr),
00512                     GET_ABSTRACT_ORIGIN(child_idx));     /* abstract_origin */
00513 
00514                 DST_append_child(parent, idx);
00515                 break;
00516             }
00517             }
00518     
00519         case DW_TAG_array_type:
00520             {
00521             if (inlined) 
00522                 break;
00523             else {
00524 #if (!defined(_LEGO_CLONER))
00525                 Current_DST = callee_file_dst;
00526 #endif
00527 
00528                 DST_ARRAY_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_ARRAY_TYPE);
00529 
00530 #if (!defined(_LEGO_CLONER))
00531                 Current_DST = caller_file_dst;
00532 #endif
00533 
00534                 idx = DST_mk_array_type(
00535                     DST_ARRAY_TYPE_decl(attr),
00536                     NULL,
00537                     DST_ARRAY_TYPE_type(attr),
00538                     DST_ARRAY_TYPE_byte_size(attr),
00539                     GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00540                     FALSE);
00541 
00542                 DST_append_child(parent, idx);
00543                 break;
00544             }
00545             }
00546     
00547         case DW_TAG_structure_type:
00548             {
00549             if (inlined) 
00550                 break;
00551             else {
00552 #if (!defined(_LEGO_CLONER))
00553                 Current_DST = callee_file_dst;
00554 #endif
00555 
00556                 DST_STRUCTURE_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_STRUCTURE_TYPE);
00557 
00558 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00559                 Current_DST = caller_file_dst;
00560 #endif
00561 
00562                 idx = DST_mk_structure_type(
00563                     DST_STRUCTURE_TYPE_decl(attr),
00564                     NULL,
00565                     DST_STRUCTURE_TYPE_byte_size(attr),
00566                     GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00567                     FALSE);
00568 
00569                 DST_append_child(parent, idx);
00570                 break;
00571             }
00572             }
00573     
00574         case DW_TAG_union_type:
00575             {
00576             if (inlined) 
00577                 break;
00578             else {
00579 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00580                 Current_DST = callee_file_dst;
00581 #endif
00582 
00583                 DST_UNION_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_UNION_TYPE);
00584 
00585 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00586                 Current_DST = caller_file_dst;
00587 #endif
00588 
00589                 idx = DST_mk_union_type(
00590                     DST_UNION_TYPE_decl(attr),
00591                     NULL,
00592                     DST_UNION_TYPE_byte_size(attr),
00593                     GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00594                     FALSE);
00595 
00596                 DST_append_child(parent, idx);
00597             }
00598             }
00599     
00600         case DW_TAG_class_type:
00601             {
00602             if (inlined) 
00603                 break;
00604             else {
00605 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00606                 Current_DST = callee_file_dst;
00607 #endif
00608 
00609                 DST_CLASS_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_CLASS_TYPE);
00610 
00611 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00612                 Current_DST = caller_file_dst;
00613 #endif
00614 
00615                 idx = DST_mk_class_type(
00616                     DST_CLASS_TYPE_decl(attr),
00617                     NULL,
00618                     DST_CLASS_TYPE_byte_size(attr),
00619                     GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00620                     FALSE);
00621 
00622                 DST_append_child(parent, idx);
00623             }
00624             }
00625     
00626         case DW_TAG_enumeration_type:
00627             {
00628             if (inlined) 
00629                 break;
00630             else {
00631 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00632                 Current_DST = callee_file_dst;
00633 #endif
00634 
00635                 DST_ENUMERATION_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_ENUMERATION_TYPE);
00636 
00637 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00638                 Current_DST = caller_file_dst;
00639 #endif
00640 
00641                 idx = DST_mk_enumeration_type(
00642                     DST_ENUMERATION_TYPE_decl(attr),
00643                     NULL,
00644                     DST_ENUMERATION_TYPE_byte_size(attr),
00645                     GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00646                     FALSE);
00647 
00648                 DST_append_child(parent, idx);
00649             }
00650             }
00651     
00652         case DW_TAG_subroutine_type:
00653             {
00654             if (inlined) 
00655                 break;
00656             else {
00657 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00658                 Current_DST = callee_file_dst;
00659 #endif
00660 
00661                 DST_SUBROUTINE_TYPE *attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes (DST_INFO_IDX_TO_PTR(child_idx)), DST_SUBROUTINE_TYPE);
00662 
00663 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00664                 Current_DST = caller_file_dst;
00665 #endif
00666 
00667                 idx = DST_mk_subroutine_type(
00668                     DST_SUBROUTINE_TYPE_decl(attr),
00669                     NULL,
00670                     DST_SUBROUTINE_TYPE_type(attr),
00671                     GET_ABSTRACT_ORIGIN(child_idx),     /* abstract_origin */
00672                     FALSE);
00673 
00674                 DST_append_child(parent, idx);
00675                 break;
00676             }
00677             }
00678         }
00679 #if (!defined(_STANDALONE_INLINER) && !defined(_LEGO_CLONER))
00680         Current_DST = callee_file_dst;
00681 #endif
00682     }
00683 }
00684 
00685 
00686 
00687 #if (!defined(_LEGO_CLONER))
00688 mUINT16
00689 DST_get_cross_file_id(DST_IDX parent,
00690                        DST_IDX inl_routine, 
00691                        DST_TYPE caller_file_dst,
00692                        DST_TYPE callee_file_dst)
00693 {
00694     DST_TYPE old_Current_DST = Current_DST;
00695     char *filename = 0;
00696     char *dirname = 0;
00697     UINT64   file_size;
00698     UINT64   fmod_time;
00699     mUINT16  ret_val = 0;
00700             
00701     Current_DST = caller_file_dst;
00702 
00703     DST_SUBPROGRAM *attr =
00704         DST_ATTR_IDX_TO_PTR (DST_INFO_attributes (DST_INFO_IDX_TO_PTR(parent)),
00705                              DST_SUBPROGRAM); 
00706 
00707     Current_DST = callee_file_dst;
00708     DST_INFO_IDX abstract_origin = get_abstract_origin(inl_routine);
00709     
00710     DST_SUBPROGRAM *inl_attr = DST_ATTR_IDX_TO_PTR (DST_INFO_attributes (DST_INFO_IDX_TO_PTR (abstract_origin)), 
00711                                                     DST_SUBPROGRAM);
00712 
00713     filename = DST_get_file (USRCPOS_filenum (DST_SUBPROGRAM_decl_decl (inl_attr)), 
00714                              &file_size, &fmod_time, &dirname); 
00715             
00716     if (filename) {
00717 
00718         Current_DST = caller_file_dst;
00719         
00720         /* find the file with SRCPOS info */
00721         ret_val = DST_get_cross_inlined_file_id (filename, dirname,
00722                                                  file_size, fmod_time); 
00723     }
00724     Current_DST = old_Current_DST;
00725 
00726     return (ret_val);
00727 }
00728 #endif // !defined(_LEGO_CLONER)
00729 
00730 
00731                        
00732 void
00733 DST_enter_inlined_subroutine(DST_IDX parent,
00734                              DST_IDX inl_routine,
00735                              LABEL_IDX begin_label,
00736                              LABEL_IDX end_label,
00737                              DST_TYPE caller_file_dst,
00738                              DST_TYPE callee_file_dst,
00739                              IPO_SYMTAB *symtab, 
00740                              MEM_POOL *caller_file_m,
00741                              MEM_POOL *callee_file_m,
00742                              mUINT16 cross_file_id)
00743 {
00744     DST_INFO_IDX idx;
00745     SCOPE *old_scope = symtab->Get_orig_scope_tab();
00746     SYMTAB_IDX old_callee_level = symtab->Get_orig_level();
00747     DST_ASSOC_INFO low_pc, high_pc;
00748 
00749     Scope_tab = symtab->Get_orig_scope_tab();
00750     CURRENT_SYMTAB = symtab->Get_orig_level();
00751 
00752 #if !defined(_LEGO_CLONER)
00753     DST_TYPE old_Current_DST = Current_DST;
00754     Current_DST = callee_file_dst;
00755 #endif
00756     DST_INFO_IDX abstract_origin = get_abstract_origin(inl_routine);
00757     mUINT16 file_index = cross_file_id;
00758 
00759 #if !defined(_LEGO_CLONER)
00760     Current_DST = caller_file_dst;
00761 #endif
00762 
00763 
00764     DST_ASSOC_INFO_st_idx(low_pc) = make_ST_IDX(
00765         begin_label,
00766         symtab->Get_cloned_level() );
00767 
00768     DST_ASSOC_INFO_st_idx(high_pc) = make_ST_IDX(
00769         end_label,
00770         symtab->Get_cloned_level() );
00771 
00772     if (caller_file_dst == callee_file_dst) {
00773         idx = DST_mk_inlined_subroutine ((void *)&low_pc, (void *)&high_pc,
00774                                              abstract_origin); 
00775 
00776         DST_append_child(parent, idx);
00777 
00778         DST_enter_cloned_childs (idx, inl_routine, symtab,
00779                                      caller_file_dst, callee_file_dst,
00780                                      file_index, TRUE, caller_file_m,
00781                                      callee_file_m); 
00782     }
00783 #if (!defined(_LEGO_CLONER))
00784     else {
00785         DST_SUBPROGRAM *attr;
00786 
00787         attr = DST_ATTR_IDX_TO_PTR (DST_INFO_attributes (DST_INFO_IDX_TO_PTR(parent)),
00788                                         DST_SUBPROGRAM); 
00789         char *filename;
00790         char *routine_name;
00791         char *dirname;
00792         UINT64   file_size;
00793         UINT64   fmod_time;
00794             
00795         Current_DST = callee_file_dst;
00796             
00797         DST_SUBPROGRAM *inl_attr = DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(DST_INFO_IDX_TO_PTR(abstract_origin)),
00798                                                            DST_SUBPROGRAM); 
00799 
00800         filename = DST_get_file (USRCPOS_filenum (DST_SUBPROGRAM_decl_decl(inl_attr)),
00801                                      &file_size, &fmod_time, &dirname); 
00802             
00803         routine_name = DST_STR_IDX_TO_PTR(DST_SUBPROGRAM_decl_name(inl_attr));
00804             Current_DST = caller_file_dst;
00805         
00806         if (filename != NULL) {
00807 
00808             idx = DST_mk_cross_inlined_subroutine((void *)&low_pc, 
00809                                                       (void *)&high_pc, 
00810                                                       routine_name,
00811                                                       &file_index,
00812                                                       file_size,
00813                                                       fmod_time,
00814                                                       DST_SUBPROGRAM_decl_decl(attr),
00815                                                       filename,
00816                                                       dirname);
00817 
00818             DST_append_child(parent, idx);
00819 
00820             DST_enter_cloned_childs(idx, inl_routine, symtab,
00821                                         caller_file_dst, callee_file_dst,
00822                                         file_index, TRUE, caller_file_m,
00823                                         callee_file_m); 
00824         }
00825     }
00826 #endif // !defined(_LEGO_CLONER)
00827 
00828 
00829     CURRENT_SYMTAB = old_callee_level;
00830     Scope_tab = old_scope;
00831 
00832 #if (!defined(_LEGO_CLONER))
00833     Current_DST = old_Current_DST;
00834 #endif
00835 } // DST_enter_inlined_subroutine
00836 
00837 
00838 
00839 DST_IDX
00840 DST_enter_cloned_subroutine(DST_IDX parent, 
00841                             DST_IDX orig_node, 
00842                             ST *cloned_st, 
00843                             DST_TYPE cur_file_dst, 
00844                             IPO_SYMTAB *sym)
00845 {
00846 
00847   DST_ASSOC_INFO subst;
00848   DST_INFO_IDX idx = DST_INVALID_INIT;
00849   DST_SUBPROGRAM *attr = 
00850     DST_ATTR_IDX_TO_PTR(DST_INFO_attributes(DST_INFO_IDX_TO_PTR(orig_node)), DST_SUBPROGRAM);
00851 
00852   Scope_tab = sym->Get_orig_scope_tab();
00853   CURRENT_SYMTAB = sym->Get_orig_level();
00854 
00855   if (cloned_st) {
00856 
00857     DST_ASSOC_INFO_st_idx(subst) = ST_st_idx(cloned_st);
00858 
00859     idx = DST_mk_cloned_subprogram(DST_SUBPROGRAM_def_decl(attr),
00860                                    ST_name(cloned_st),
00861                                    DST_SUBPROGRAM_def_type(attr),
00862                                    orig_node,
00863                                    (void *)&subst,
00864                                    DST_SUBPROGRAM_def_inline(attr),
00865                                    DST_SUBPROGRAM_def_virtuality(attr));
00866 
00867     DST_append_child(parent, idx);
00868 
00869     DST_enter_cloned_childs(idx, orig_node, sym, cur_file_dst, 
00870                             cur_file_dst, 0, FALSE, NULL, NULL);
00871   }
00872 
00873   return idx;
00874 }
00875 
00876 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines