1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 23 /* 24 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 #include "_debug.h" 30 #include "msg.h" 31 #include "libld.h" 32 33 void 34 Dbg_statistics_ld(Ofl_desc *ofl) 35 { 36 if (DBG_NOTCLASS(DBG_STATISTICS)) 37 return; 38 39 dbg_print(MSG_ORIG(MSG_STR_EMPTY)); 40 dbg_print(MSG_INTL(MSG_STATS_GENERAL)); 41 42 if (ofl->ofl_objscnt || ofl->ofl_soscnt || ofl->ofl_arscnt) { 43 dbg_print(MSG_INTL(MSG_STATS_FILES), 44 EC_XWORD(ofl->ofl_objscnt), EC_XWORD(ofl->ofl_soscnt), 45 EC_XWORD(ofl->ofl_arscnt)); 46 } 47 48 if (ofl->ofl_locscnt || ofl->ofl_globcnt) { 49 dbg_print(MSG_INTL(MSG_STATS_SYMBOLS_OUT), 50 EC_XWORD(ofl->ofl_globcnt), EC_XWORD(ofl->ofl_locscnt)); 51 } 52 if (ofl->ofl_entercnt || ofl->ofl_scopecnt || ofl->ofl_elimcnt) { 53 dbg_print(MSG_INTL(MSG_STATS_SYMBOLS_IN), 54 EC_XWORD(ofl->ofl_entercnt), EC_XWORD(ofl->ofl_scopecnt), 55 EC_XWORD(ofl->ofl_elimcnt)); 56 } 57 58 if (ofl->ofl_outrelscnt) { 59 dbg_print(MSG_INTL(MSG_STATS_RELOCS_OUT), 60 EC_XWORD(ofl->ofl_outrelscnt)); 61 } 62 if (ofl->ofl_entrelscnt || ofl->ofl_actrelscnt) { 63 dbg_print(MSG_INTL(MSG_STATS_RELOCS_IN), 64 EC_XWORD(ofl->ofl_entrelscnt), 65 EC_XWORD(ofl->ofl_actrelscnt)); 66 } 67 } 68 69 void 70 Dbg_statistics_ar(Ofl_desc *ofl) 71 { 72 Listnode *lnp; 73 Ar_desc *adp; 74 Elf_Arsym *arsym; 75 Ar_aux *aux; 76 77 if (DBG_NOTCLASS(DBG_STATISTICS | DBG_UNUSED)) 78 return; 79 80 dbg_print(MSG_ORIG(MSG_STR_EMPTY)); 81 for (LIST_TRAVERSE(&ofl->ofl_ars, lnp, adp)) { 82 size_t poffset = 0; 83 uint_t count = 0, used = 0; 84 85 if ((adp->ad_flags & FLG_ARD_EXTRACT) == 0) { 86 Dbg_unused_file(adp->ad_name, 0); 87 continue; 88 } 89 90 if (DBG_NOTCLASS(DBG_STATISTICS)) 91 continue; 92 93 arsym = adp->ad_start; 94 aux = adp->ad_aux; 95 while (arsym->as_off) { 96 /* 97 * Assume that symbols from the same member file are 98 * adjacent within the archive symbol table. 99 */ 100 if (poffset != arsym->as_off) { 101 count++; 102 poffset = arsym->as_off; 103 if (aux->au_mem == FLG_ARMEM_PROC) 104 used++; 105 } 106 aux++, arsym++; 107 } 108 if ((count == 0) || (used == 0)) 109 continue; 110 #ifndef UDIV_NOT_SUPPORTED 111 dbg_print(MSG_INTL(MSG_STATS_AR), adp->ad_name, count, used, 112 ((used * 100) / count)); 113 #endif 114 } 115 dbg_print(MSG_ORIG(MSG_STR_EMPTY)); 116 } 117