OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_dwarf_tag_function.c
index fa2f778..636a08c 100644 (file)
@@ -62,25 +62,24 @@ int
 
 /*----------------------------------------------------------------------
   DW_TAG_subprogram
-    (Not Used)
       DW_AT_name
       DW_AT_decl_file
       DW_AT_decl_line
-
-      DW_AT_prototyped
-      DW_AT_inline
-      DW_AT_external
-
       DW_AT_low_pc
       DW_AT_high_pc
       DW_AT_ranges
-      DW_AT_entry_pc
-      DW_AT_segment & DW_AT_address_class
+      DW_AT_type
+      DW_AT_prototyped
+      DW_AT_inline
+      DW_AT_external
       DW_AT_return_addr
       DW_AT_frame_base
       DW_AT_static_link
-      DW_AT_type
       DW_AT_calling_convention
+
+       // UnImplement
+      DW_AT_entry_pc   // for OBJ-file
+      DW_AT_segment & DW_AT_address_class      // for IA-32(segment)
       DW_AT_elemental   // for FORTRAN only.
       DW_AT_pure        // for FORTRAN only.
       DW_AT_recursive   // for FORTRAN only.
@@ -98,13 +97,16 @@ int
 
        int                                                     i_result;
        int                                                     i_cnt;
+       int                                                     i_srcid                 = NO_SRC;
        int                                                     i_objid                 = NO_OBJ;
        int                                                     i_objid_parent  = NO_OBJ;
        char                                            *pstr_filepath  = NULL;
-       char                                            *pstr_path   = NULL;
+       char                                            *pstr_path              = NULL;
        char                                            *pstr_filename;
        char                                            str_filename[DRD64_MAX_PATH+1];
        char                                            str_path[DRD64_MAX_PATH+1];
+       Byte                                            *pb_link                = NULL;
+       DWord                                           dw_srcline              = 0;
        DWord                                           dw_lineoffset;
        QWord                                           qw_low_pc;
        QWord                                           qw_high_pc;
@@ -112,15 +114,15 @@ int
        LibGoblin_BinaryFile            *p_bfile;
        LibGoblin_ProgramInfo           *p_pginfo;
        LibGoblin_ObjectInfo            *pobj_parent;
-       LibGoblin_ObjectInfo            *p_obj;
+       LibGoblin_ObjectInfo            *pobj_now;
 
        LibGoblin_DWARF_Ranges          t_ranges;
        LibGoblin_DWARF_DIEValue        *pval_name;
        LibGoblin_DWARF_DIEValue        *pval_declfile;
        LibGoblin_DWARF_DIEValue        *pval_declline;
-       LibGoblin_DWARF_DIEValue        *pval_prototyped;
-       LibGoblin_DWARF_DIEValue        *pval_inline;
-       LibGoblin_DWARF_DIEValue        *pval_external;
+       LibGoblin_DWARF_DIEValue        *pval_prototyped;       // flag
+       LibGoblin_DWARF_DIEValue        *pval_inline;           // constant - DW_INL_xxx
+       LibGoblin_DWARF_DIEValue        *pval_external;         // flag
        LibGoblin_DWARF_DIEValue        *pval_lowpc;
        LibGoblin_DWARF_DIEValue        *pval_highpc;
        LibGoblin_DWARF_DIEValue        *pval_ranges;
@@ -136,27 +138,27 @@ int
 
        assert( NULL != p_binfo );
 
-       pval_name               = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
-       pval_lowpc              = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
-       pval_highpc             = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
-       pval_ranges             = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
-       pval_inline             = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
-       pval_declfile   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
-       pval_declline   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
-       pval_prototyped = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
-       pval_external   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
-       pval_entry_pc   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
-       pval_segment    = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
-       pval_addr_class = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
-       pval_return_addr        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
+       pval_name                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+       pval_lowpc                      = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
+       pval_highpc                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
+       pval_ranges                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
+       pval_declfile           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
+       pval_declline           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
+       pval_type                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
+       pval_inline                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
+       pval_prototyped         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
+       pval_external           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
        pval_frame_base         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_frame_base );
+       pval_return_addr        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
        pval_static_link        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_static_link );
-       pval_type                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
        pval_calling_convention = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_calling_convention );
+       // UnImplement
+       pval_entry_pc           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
+       pval_segment            = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
+       pval_addr_class         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
 
        if( NULL == pval_name )
                { goto  goto_DWARF_Tag_Function_subprogram_post; }
-       //if( NULL != pval_name )       { pstr_filepath  = pval_name->value.pstr_value; }
 
        p_pginfo        = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
        assert( NULL != p_pginfo );
@@ -191,86 +193,84 @@ int
        }
        // Pattern D ---
        else    {
-               if( NULL == pval_inline )
-                       { goto  goto_DWARF_Tag_Function_subprogram_post; }
-
                t_ranges.i_ranges                       = 1;
                t_ranges.ptr_low[0].value       = (PtrValue)pobj_parent->addr.ptr_addr.value;
                t_ranges.ptr_high[0].value      = (PtrValue)pobj_parent->addr.ptr_addr.value;
        }
        
-       
-/*
-       p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
-       assert( NULL != p_bfile );
-
-       // (Phase1) Data Extract from .debug_info ===============================
-
-       // Data Extract (location)--- [MUST]
-       pval_lowpc      = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
-       pval_highpc     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
-       pval_ranges     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
-       
-
-       // Data Extract (stmt_list)---
-       pval_linestmt   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_stmt_list );
-       if( NULL == pval_linestmt )
-               { goto  goto_DWARF_Tag_CompileUnit_compile_unit_post; }
-
-
-       // (Phase2) Regist SrcFile from .dwarf_line ===================================
-       SrcFile_ClearSrcFileTable_inBinaryInfo( p_binfo );
-
-       p_srcfile       = SrcFile_DispenseSrcFile( p_bfile, pstr_filename, pstr_path);
-       if( NULL == p_srcfile ) {
-               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
+       if( NULL != pval_declfile )     {
+               DWARF_AttrForm_ExtensionDIEValue( pval_declfile );
+               i_srcid = SrcFile_GetSrcFileTable_inBinaryInfo(
+                                                               p_binfo, (int)pval_declfile->value.qw_value );
        }
 
-       i_result        = SrcFile_RegistSrcFileTable_inBinaryInfo( p_binfo, p_srcfile );
-       if( 0x00 != i_result )  {
-               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
-       }
-
-       dw_lineoffset   = pval_linestmt->value.dw_value;
-       i_result                = DWARF_Line_ReadSrcFile( p_binfo, dw_lineoffset );
-       if( 0x00 != i_result )  {
-               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
+       if( NULL != pval_declline ) {
+               DWARF_AttrForm_ExtensionDIEValue( pval_declline );
+               dw_srcline      = (DWord)pval_declline->value.qw_value;
        }
 
+       if( NULL != pval_type )
+               { pb_link       = pval_type->value.pb_link; }
 
-       // (Phase3) Regist ObjInfo as ObjFile =========================================
 
+       // Inset & Regist. ObjectInfo ------------------------------------
        for( i_cnt = 0; i_cnt < t_ranges.i_ranges; i_cnt++ )    {
-               p_obj   = ObjectInfo_InsetObject(
-                                                       p_pginfo, t_ranges.ptr_low[i_cnt].value,
-                                                       (QWord)(t_ranges.ptr_high[i_cnt].value - t_ranges.ptr_low[i_cnt].value),
-                                                       NULL, OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_ADOPT,
-                                                       OBJINFO_TYPE_OBJFILE );
+               pobj_now        = ObjectInfo_InsetObject(
+                                               p_pginfo, t_ranges.ptr_low[i_cnt].value,
+                                               (QWord)(t_ranges.ptr_high[i_cnt].value - t_ranges.ptr_low[i_cnt].value),
+                                               NULL,
+                                               OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_CHKNAME,
+                                               OBJINFO_TYPE_FUNCTION, pval_name->value.pstr_value );
+
+               pobj_now->i_srcid                               = i_srcid;
+               pobj_now->dw_srcline                    = dw_srcline;
+               pobj_now->dwarf.i_objid_type    = NO_OBJ;
+               pobj_now->dwarf.pb_dwinfo_type  = pb_link;
+
+               pobj_now->info.function.flag.external   = ((NULL != pval_external) ? 1 : 0 );
+               pobj_now->info.function.flag.prototyped = ((NULL != pval_prototyped) ? 1 : 0 );
+
+               pobj_now->info.function.b_convention    = ((NULL != pval_calling_convention)
+                                                                                                       ? pval_calling_convention->value.b_value
+                                                                                                       : DW_CC_normal ); 
+
+               if( NULL != pval_frame_base )   {
+                       pobj_now->info.function.dw_sz_frame_base        = (DWord)pval_frame_base->qw_size;
+                       pobj_now->info.function.pb_frame_base           = pval_frame_base->value.pb_data;
+               }
 
-               p_obj->pstr_name        = pval_name->value.pstr_value;
-               p_obj->dw_hash          = Common_CalcDJBhash( pval_name->value.pstr_value );
+               if( NULL != pval_return_addr )  {
+                       pobj_now->info.function.dw_sz_return_addr       = (DWord)pval_return_addr->qw_size;
+                       pobj_now->info.function.pb_return_addr          = pval_return_addr->value.pb_data;
+               }
+
+               if( NULL != pval_static_link )  {
+                       pobj_now->info.function.dw_sz_static_link       = (DWord)pval_static_link->qw_size;
+                       pobj_now->info.function.pb_static_link          = pval_static_link->value.pb_data;
+               }
+
+               if( NULL != pval_inline )       {
+                       if(( DW_INL_inlined == pval_inline->value.b_value )
+                                       || ( DW_INL_declared_inlined == pval_inline->value.b_value ))
+                               { pobj_now->info.function.flag.inlined  = 1; }
+       
+                       if(( DW_INL_declared_not_inlined == pval_inline->value.b_value )
+                                       || ( DW_INL_declared_inlined == pval_inline->value.b_value ))
+                               { pobj_now->info.function.flag.inline_def       = 1; }
+               }
 
                if( 0 == i_cnt )        {
-                       p_obj_parent    = p_obj;
-                       p_obj->info.objfile.i_objid_parent      = NO_OBJ;
+                       pobj_parent     = pobj_now;
+                       pobj_now->info.function.i_objid_parent  = NO_OBJ;
                }
                else    {
-                       p_obj->info.objfile.i_objid_parent      = p_obj_parent->i_id;
+                       pobj_now->info.function.i_objid_parent  = pobj_parent->i_id;
                }
-               p_obj->i_srcid  = p_srcfile->i_id;
        }
-       i_objid = p_obj_parent->i_id;
-
-goto_DWARF_Tag_CompileUnit_compile_unit_post:
 
-*/
 goto_DWARF_Tag_Function_subprogram_post:
-       printf( "  UnImplement DW_TAG_subprogram: %s [%02xh]\n",
-                                                       Debug_DWARF_GetTAGname( dw_tag ), dw_tag );
-       return NO_OBJ;
+       return  i_objid_parent; 
 }
 
 
-
-
 /* EOF of drd64_.c ----------------------------------- */