Annotation of GNUtools/cc/xcoffout.c, revision 1.1

1.1     ! root        1: /* Output xcoff-format symbol table information from GNU compiler.
        !             2:    Copyright (C) 1992 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 2, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU CC is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU CC; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: 
        !            21: /* Output xcoff-format symbol table data.  The main functionality is contained
        !            22:    in dbxout.c.  This file implements the sdbout-like parts of the xcoff
        !            23:    interface.  Many functions are very similar to their counterparts in
        !            24:    sdbout.c.  */
        !            25: 
        !            26: /* Include this first, because it may define MIN and MAX.  */
        !            27: #include <stdio.h>
        !            28: 
        !            29: #include "config.h"
        !            30: #include "tree.h"
        !            31: #include "rtl.h"
        !            32: #include "flags.h"
        !            33: 
        !            34: #ifdef XCOFF_DEBUGGING_INFO
        !            35: 
        !            36: /* This defines the C_* storage classes.  */
        !            37: #include <dbxstclass.h>
        !            38: 
        !            39: #include "xcoffout.h"
        !            40: 
        !            41: #if defined (USG) || defined (NO_STAB_H)
        !            42: #include "gstab.h"
        !            43: #else
        !            44: #include <stab.h>
        !            45: 
        !            46: /* This is a GNU extension we need to reference in this file.  */
        !            47: #ifndef N_CATCH
        !            48: #define N_CATCH 0x54
        !            49: #endif
        !            50: #endif
        !            51: 
        !            52: /* Line number of beginning of current function, minus one.
        !            53:    Negative means not in a function or not using xcoff.  */
        !            54: 
        !            55: int xcoff_begin_function_line = -1;
        !            56: 
        !            57: /* Name of the current include file.  */
        !            58: 
        !            59: char *xcoff_current_include_file;
        !            60: 
        !            61: /* Name of the current function file.  This is the file the `.bf' is
        !            62:    emitted from.  In case a line is emitted from a different file,
        !            63:    (by including that file of course), then the line number will be
        !            64:    absolute.  */
        !            65: 
        !            66: char *xcoff_current_function_file;
        !            67: 
        !            68: /* Names of bss and data sections.  These should be unique names for each
        !            69:    compilation unit.  */
        !            70: 
        !            71: char *xcoff_bss_section_name;
        !            72: char *xcoff_private_data_section_name;
        !            73: char *xcoff_read_only_section_name;
        !            74: 
        !            75: /* Macro definitions used below.  */
        !            76: /* Ensure we don't output a negative line number.  */
        !            77: #define MAKE_LINE_SAFE(LINE)  \
        !            78:   if (LINE <= xcoff_begin_function_line)       \
        !            79:     LINE = xcoff_begin_function_line + 1       \
        !            80: 
        !            81: #define ASM_OUTPUT_LFB(FILE,LINENUM) \
        !            82: {                                              \
        !            83:   if (xcoff_begin_function_line == -1)         \
        !            84:     {                                          \
        !            85:       xcoff_begin_function_line = (LINENUM) - 1;\
        !            86:       fprintf (FILE, "\t.bf\t%d\n", (LINENUM));        \
        !            87:     }                                          \
        !            88:   xcoff_current_function_file                  \
        !            89:     = (xcoff_current_include_file              \
        !            90:        ? xcoff_current_include_file : main_input_filename); \
        !            91: }
        !            92: 
        !            93: #define ASM_OUTPUT_LFE(FILE,LINENUM) \
        !            94:   do {                                         \
        !            95:     int linenum = LINENUM;                             \
        !            96:     MAKE_LINE_SAFE (linenum);                  \
        !            97:     fprintf (FILE, "\t.ef\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \
        !            98:     xcoff_begin_function_line = -1;            \
        !            99:   } while (0)
        !           100: 
        !           101: #define ASM_OUTPUT_LBB(FILE,LINENUM,BLOCKNUM) \
        !           102:   do {                                         \
        !           103:     int linenum = LINENUM;                             \
        !           104:     MAKE_LINE_SAFE (linenum);                  \
        !           105:     fprintf (FILE, "\t.bb\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \
        !           106:   } while (0)
        !           107: 
        !           108: #define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \
        !           109:   do {                                         \
        !           110:     int linenum = LINENUM;                             \
        !           111:     MAKE_LINE_SAFE (linenum);                  \
        !           112:     fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \
        !           113:   } while (0)
        !           114: 
        !           115: /* Support routines for XCOFF debugging info.  */
        !           116: 
        !           117: /* Assign NUMBER as the stabx type number for the type described by NAME.
        !           118:    Search all decls in the list SYMS to find the type NAME.  */
        !           119: 
        !           120: static void
        !           121: assign_type_number (syms, name, number)
        !           122:      tree syms;
        !           123:      char *name;
        !           124:      int number;
        !           125: {
        !           126:   tree decl;
        !           127: 
        !           128:   for (decl = syms; decl; decl = TREE_CHAIN (decl))
        !           129:     if (DECL_NAME (decl)
        !           130:        && strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), name) == 0)
        !           131:       {
        !           132:        TREE_ASM_WRITTEN (decl) = 1;
        !           133:        TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = number;
        !           134:       }
        !           135: }
        !           136: 
        !           137: /* Setup gcc primitive types to use the XCOFF built-in type numbers where
        !           138:    possible.  */
        !           139: 
        !           140: void
        !           141: xcoff_output_standard_types (syms)
        !           142:      tree syms;
        !           143: {
        !           144:   /* Handle built-in C types here.  */
        !           145: 
        !           146:   assign_type_number (syms, "int", -1);
        !           147:   assign_type_number (syms, "char", -2);
        !           148:   assign_type_number (syms, "short int", -3);
        !           149:   assign_type_number (syms, "long int", -4);
        !           150:   assign_type_number (syms, "unsigned char", -5);
        !           151:   assign_type_number (syms, "signed char", -6);
        !           152:   assign_type_number (syms, "short unsigned int", -7);
        !           153:   assign_type_number (syms, "unsigned int", -8);
        !           154:   /* No such type "unsigned".  */
        !           155:   assign_type_number (syms, "long unsigned int", -10);
        !           156:   assign_type_number (syms, "void", -11);
        !           157:   assign_type_number (syms, "float", -12);
        !           158:   assign_type_number (syms, "double", -13);
        !           159:   assign_type_number (syms, "long double", -14);
        !           160:   /* Pascal and Fortran types run from -15 to -29.  */
        !           161:   /* No such type "wchar".  */
        !           162: 
        !           163:   /* "long long int", and "long long unsigned int", are not handled here,
        !           164:      because there are no predefined types that match them.  */
        !           165: 
        !           166:   /* ??? Should also handle built-in C++ and Obj-C types.  There perhaps
        !           167:      aren't any that C doesn't already have.  */
        !           168: }
        !           169: 
        !           170: /* Print an error message for unrecognized stab codes.  */
        !           171: 
        !           172: #define UNKNOWN_STAB(STR)      \
        !           173:    do { \
        !           174:      fprintf(stderr, "Error, unknown stab %s: : 0x%x\n", STR, stab); \
        !           175:      fflush (stderr);  \
        !           176:    } while (0)
        !           177: 
        !           178: /* Conversion routine from BSD stabs to AIX storage classes.  */
        !           179: 
        !           180: int
        !           181: stab_to_sclass (stab)
        !           182:      int stab;
        !           183: {
        !           184:   switch (stab)
        !           185:     {
        !           186:     case N_GSYM:
        !           187:       return C_GSYM;
        !           188: 
        !           189:     case N_FNAME:
        !           190:       UNKNOWN_STAB ("N_FNAME"); 
        !           191:       abort();
        !           192: 
        !           193:     case N_FUN:
        !           194:       return C_FUN;
        !           195: 
        !           196:     case N_STSYM:
        !           197:     case N_LCSYM:
        !           198:       return C_STSYM;
        !           199: 
        !           200: #ifdef N_MAIN
        !           201:     case N_MAIN:
        !           202:       UNKNOWN_STAB ("N_MAIN"); 
        !           203:       abort ();
        !           204: #endif
        !           205: 
        !           206:     case N_RSYM:
        !           207:       return C_RSYM;
        !           208: 
        !           209:     case N_SSYM:
        !           210:       UNKNOWN_STAB ("N_SSYM"); 
        !           211:       abort ();
        !           212: 
        !           213:     case N_RPSYM:
        !           214:       return C_RPSYM;
        !           215: 
        !           216:     case N_PSYM:
        !           217:       return C_PSYM;
        !           218:     case N_LSYM:
        !           219:       return C_LSYM;
        !           220:     case N_DECL:
        !           221:       return C_DECL;
        !           222:     case N_ENTRY:
        !           223:       return C_ENTRY;
        !           224: 
        !           225:     case N_SO:
        !           226:       UNKNOWN_STAB ("N_SO"); 
        !           227:       abort ();
        !           228: 
        !           229:     case N_SOL:
        !           230:       UNKNOWN_STAB ("N_SOL"); 
        !           231:       abort ();
        !           232: 
        !           233:     case N_SLINE:
        !           234:       UNKNOWN_STAB ("N_SLINE"); 
        !           235:       abort ();
        !           236: 
        !           237: #ifdef N_DSLINE
        !           238:     case N_DSLINE:
        !           239:       UNKNOWN_STAB ("N_DSLINE"); 
        !           240:       abort ();
        !           241: #endif
        !           242: 
        !           243: #ifdef N_BSLINE
        !           244:     case N_BSLINE:
        !           245:       UNKNOWN_STAB ("N_BSLINE"); 
        !           246:       abort ();
        !           247: #endif
        !           248: #if 0
        !           249:       /* This has the same value as N_BSLINE.  */
        !           250:     case N_BROWS:
        !           251:       UNKNOWN_STAB ("N_BROWS"); 
        !           252:       abort ();
        !           253: #endif
        !           254: 
        !           255: #ifdef N_BINCL
        !           256:     case N_BINCL:
        !           257:       UNKNOWN_STAB ("N_BINCL"); 
        !           258:       abort ();
        !           259: #endif
        !           260: 
        !           261: #ifdef N_EINCL
        !           262:     case N_EINCL:
        !           263:       UNKNOWN_STAB ("N_EINCL"); 
        !           264:       abort ();
        !           265: #endif
        !           266: 
        !           267: #ifdef N_EXCL
        !           268:     case N_EXCL:
        !           269:       UNKNOWN_STAB ("N_EXCL"); 
        !           270:       abort ();
        !           271: #endif
        !           272: 
        !           273:     case N_LBRAC:
        !           274:       UNKNOWN_STAB ("N_LBRAC"); 
        !           275:       abort ();
        !           276: 
        !           277:     case N_RBRAC:
        !           278:       UNKNOWN_STAB ("N_RBRAC"); 
        !           279:       abort ();
        !           280: 
        !           281:     case N_BCOMM:
        !           282:       return C_BCOMM;
        !           283:     case N_ECOMM:
        !           284:       return C_ECOMM;
        !           285:     case N_ECOML:
        !           286:       return C_ECOML;
        !           287: 
        !           288:     case N_LENG:
        !           289:       UNKNOWN_STAB ("N_LENG"); 
        !           290:       abort ();
        !           291: 
        !           292:     case N_PC:
        !           293:       UNKNOWN_STAB ("N_PC"); 
        !           294:       abort ();
        !           295: 
        !           296: #ifdef N_M2C
        !           297:     case N_M2C:
        !           298:       UNKNOWN_STAB ("N_M2C"); 
        !           299:       abort ();
        !           300: #endif
        !           301: 
        !           302: #ifdef N_SCOPE
        !           303:     case N_SCOPE:
        !           304:       UNKNOWN_STAB ("N_SCOPE"); 
        !           305:       abort ();
        !           306: #endif
        !           307: 
        !           308:     case N_CATCH:
        !           309:       UNKNOWN_STAB ("N_CATCH"); 
        !           310:       abort ();
        !           311: 
        !           312:     default:
        !           313:       UNKNOWN_STAB ("default"); 
        !           314:       abort ();
        !           315:   }
        !           316: }
        !           317: 
        !           318: /* In XCOFF, we have to have this .bf before the function prologue.
        !           319:    Rely on the value of `dbx_begin_function_line' not to duplicate .bf.  */
        !           320: 
        !           321: void
        !           322: xcoffout_output_first_source_line (file, last_linenum)
        !           323:      FILE *file;
        !           324:      int last_linenum;
        !           325: {
        !           326:   ASM_OUTPUT_LFB (file, last_linenum);
        !           327:   dbxout_parms (DECL_ARGUMENTS (current_function_decl));
        !           328:   ASM_OUTPUT_SOURCE_LINE (file, last_linenum);
        !           329: }
        !           330: 
        !           331: /* Output the symbols defined in block number DO_BLOCK.
        !           332:    Set NEXT_BLOCK_NUMBER to 0 before calling.
        !           333: 
        !           334:    This function works by walking the tree structure of blocks,
        !           335:    counting blocks until it finds the desired block.  */
        !           336: 
        !           337: static int do_block = 0;
        !           338: 
        !           339: static int next_block_number;
        !           340: 
        !           341: static void
        !           342: xcoffout_block (block, depth, args)
        !           343:      register tree block;
        !           344:      int depth;
        !           345:      tree args;
        !           346: {
        !           347:   while (block)
        !           348:     {
        !           349:       /* Ignore blocks never expanded or otherwise marked as real.  */
        !           350:       if (TREE_USED (block))
        !           351:        {
        !           352:          /* When we reach the specified block, output its symbols.  */
        !           353:          if (next_block_number == do_block)
        !           354:            {
        !           355:              /* Output the syms of the block.  */
        !           356:              if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
        !           357:                dbxout_syms (BLOCK_VARS (block));
        !           358:              if (args)
        !           359:                dbxout_reg_parms (args);
        !           360: 
        !           361:              /* We are now done with the block.  Don't go to inner blocks.  */
        !           362:              return;
        !           363:            }
        !           364:          /* If we are past the specified block, stop the scan.  */
        !           365:          else if (next_block_number >= do_block)
        !           366:            return;
        !           367: 
        !           368:          next_block_number++;
        !           369: 
        !           370:          /* Output the subblocks.  */
        !           371:          xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
        !           372:        }
        !           373:       block = BLOCK_CHAIN (block);
        !           374:     }
        !           375: }
        !           376: 
        !           377: /* Describe the beginning of an internal block within a function.
        !           378:    Also output descriptions of variables defined in this block.
        !           379: 
        !           380:    N is the number of the block, by order of beginning, counting from 1,
        !           381:    and not counting the outermost (function top-level) block.
        !           382:    The blocks match the BLOCKs in DECL_INITIAL (current_function_decl),
        !           383:    if the count starts at 0 for the outermost one.  */
        !           384: 
        !           385: void
        !           386: xcoffout_begin_block (file, line, n)
        !           387:      FILE *file;
        !           388:      int line;
        !           389:      int n;
        !           390: {
        !           391:   tree decl = current_function_decl;
        !           392: 
        !           393:   ASM_OUTPUT_LBB (file, line, n);
        !           394: 
        !           395:   do_block = n;
        !           396:   next_block_number = 0;
        !           397:   xcoffout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
        !           398: }
        !           399: 
        !           400: /* Describe the end line-number of an internal block within a function.  */
        !           401: 
        !           402: void
        !           403: xcoffout_end_block (file, line, n)
        !           404:      FILE *file;
        !           405:      int line;
        !           406:      int n;
        !           407: {
        !           408:   ASM_OUTPUT_LBE (file, line, n);
        !           409: }
        !           410: 
        !           411: /* Called at beginning of function (before prologue).
        !           412:    Declare function as needed for debugging.  */
        !           413: 
        !           414: void
        !           415: xcoffout_declare_function (file, decl, name)
        !           416:      FILE *file;
        !           417:      tree decl;
        !           418:      char *name;
        !           419: {
        !           420:   char *n = name;
        !           421:   int i;
        !           422: 
        !           423:   for (i = 0; name[i]; ++i)
        !           424:     {
        !           425:       if (name[i] == '[')
        !           426:        {
        !           427:          n = (char *) alloca (i + 1);
        !           428:          strncpy (n, name, i);
        !           429:          n[i] = '\0';
        !           430:          break;
        !           431:        }
        !           432:     }
        !           433: 
        !           434:   /* Any pending .bi or .ei must occur before the .function psuedo op.
        !           435:      Otherwise debuggers will think that the function is in the previous
        !           436:      file and/or at the wrong line number.  */
        !           437:   dbxout_source_file (file, DECL_SOURCE_FILE (decl));
        !           438:   dbxout_symbol (decl, 0);
        !           439:   fprintf (file, "\t.function .%s,.%s,16,044,FE..%s-.%s\n", n, n, n, n);
        !           440: }
        !           441: 
        !           442: /* Called at beginning of function body (after prologue).
        !           443:    Record the function's starting line number, so we can output
        !           444:    relative line numbers for the other lines.
        !           445:    Record the file name that this function is contained in.  */
        !           446: 
        !           447: void
        !           448: xcoffout_begin_function (file, last_linenum)
        !           449:      FILE *file;
        !           450:      int last_linenum;
        !           451: {
        !           452:   ASM_OUTPUT_LFB (file, last_linenum);
        !           453: }
        !           454: 
        !           455: /* Called at end of function (before epilogue).
        !           456:    Describe end of outermost block.  */
        !           457: 
        !           458: void
        !           459: xcoffout_end_function (file, last_linenum)
        !           460:      FILE *file;
        !           461:      int last_linenum;
        !           462: {
        !           463:   ASM_OUTPUT_LFE (file, last_linenum);
        !           464: }
        !           465: 
        !           466: /* Output xcoff info for the absolute end of a function.
        !           467:    Called after the epilogue is output.  */
        !           468: 
        !           469: void
        !           470: xcoffout_end_epilogue (file)
        !           471:      FILE *file;
        !           472: {
        !           473:   /* We need to pass the correct function size to .function, otherwise,
        !           474:      the xas assembler can't figure out the correct size for the function
        !           475:      aux entry.  So, we emit a label after the last instruction which can
        !           476:      be used by the .function pseudo op to calculate the function size.  */
        !           477: 
        !           478:   char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
        !           479:   if (*fname == '*')
        !           480:     ++fname;
        !           481:   fprintf (file, "FE..");
        !           482:   ASM_OUTPUT_LABEL (file, fname);
        !           483: }
        !           484: #endif /* XCOFF_DEBUGGING_INFO */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.