github.com/rohankumardubey/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/cmd/5l/prof.c (about)

     1  // Inferno utils/5l/obj.c
     2  // http://code.google.com/p/inferno-os/source/browse/utils/5l/obj.c
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  // Profiling.
    32  
    33  #include "l.h"
    34  #include "../ld/lib.h"
    35  
    36  void
    37  doprof1(void)
    38  {
    39  #ifdef	NOTDEF	// TODO(rsc)
    40  	Sym *s;
    41  	int32 n;
    42  	Prog *p, *q;
    43  
    44  	if(debug['v'])
    45  		Bprint(&bso, "%5.2f profile 1\n", cputime());
    46  	Bflush(&bso);
    47  	s = lookup("__mcount", 0);
    48  	n = 1;
    49  	for(p = firstp->link; p != P; p = p->link) {
    50  		if(p->as == ATEXT) {
    51  			q = prg();
    52  			q->line = p->line;
    53  			q->link = datap;
    54  			datap = q;
    55  			q->as = ADATA;
    56  			q->from.type = D_OREG;
    57  			q->from.name = D_EXTERN;
    58  			q->from.offset = n*4;
    59  			q->from.sym = s;
    60  			q->reg = 4;
    61  			q->to = p->from;
    62  			q->to.type = D_CONST;
    63  
    64  			q = prg();
    65  			q->line = p->line;
    66  			q->pc = p->pc;
    67  			q->link = p->link;
    68  			p->link = q;
    69  			p = q;
    70  			p->as = AMOVW;
    71  			p->from.type = D_OREG;
    72  			p->from.name = D_EXTERN;
    73  			p->from.sym = s;
    74  			p->from.offset = n*4 + 4;
    75  			p->to.type = D_REG;
    76  			p->to.reg = REGTMP;
    77  
    78  			q = prg();
    79  			q->line = p->line;
    80  			q->pc = p->pc;
    81  			q->link = p->link;
    82  			p->link = q;
    83  			p = q;
    84  			p->as = AADD;
    85  			p->from.type = D_CONST;
    86  			p->from.offset = 1;
    87  			p->to.type = D_REG;
    88  			p->to.reg = REGTMP;
    89  
    90  			q = prg();
    91  			q->line = p->line;
    92  			q->pc = p->pc;
    93  			q->link = p->link;
    94  			p->link = q;
    95  			p = q;
    96  			p->as = AMOVW;
    97  			p->from.type = D_REG;
    98  			p->from.reg = REGTMP;
    99  			p->to.type = D_OREG;
   100  			p->to.name = D_EXTERN;
   101  			p->to.sym = s;
   102  			p->to.offset = n*4 + 4;
   103  
   104  			n += 2;
   105  			continue;
   106  		}
   107  	}
   108  	q = prg();
   109  	q->line = 0;
   110  	q->link = datap;
   111  	datap = q;
   112  
   113  	q->as = ADATA;
   114  	q->from.type = D_OREG;
   115  	q->from.name = D_EXTERN;
   116  	q->from.sym = s;
   117  	q->reg = 4;
   118  	q->to.type = D_CONST;
   119  	q->to.offset = n;
   120  
   121  	s->type = SBSS;
   122  	s->value = n*4;
   123  #endif
   124  }
   125  
   126  void
   127  doprof2(void)
   128  {
   129  	Sym *s2, *s4;
   130  	Prog *p, *q, *ps2, *ps4;
   131  
   132  	if(debug['v'])
   133  		Bprint(&bso, "%5.2f profile 2\n", cputime());
   134  	Bflush(&bso);
   135  	s2 = lookup("_profin", 0);
   136  	s4 = lookup("_profout", 0);
   137  	if(s2->type != STEXT || s4->type != STEXT) {
   138  		diag("_profin/_profout not defined");
   139  		return;
   140  	}
   141  	ps2 = P;
   142  	ps4 = P;
   143  	for(cursym = textp; cursym != nil; cursym = cursym->next) {
   144  		p = cursym->text;
   145  		if(cursym == s2) {
   146  			ps2 = p;
   147  			p->reg = 1;
   148  		}
   149  		if(cursym == s4) {
   150  			ps4 = p;
   151  			p->reg = 1;
   152  		}
   153  	}
   154  	for(cursym = textp; cursym != nil; cursym = cursym->next)
   155  	for(p = cursym->text; p != P; p = p->link) {
   156  		if(p->as == ATEXT) {
   157  			if(p->reg & NOPROF) {
   158  				for(;;) {
   159  					q = p->link;
   160  					if(q == P)
   161  						break;
   162  					if(q->as == ATEXT)
   163  						break;
   164  					p = q;
   165  				}
   166  				continue;
   167  			}
   168  
   169  			/*
   170  			 * BL	profin, R2
   171  			 */
   172  			q = prg();
   173  			q->line = p->line;
   174  			q->pc = p->pc;
   175  			q->link = p->link;
   176  			p->link = q;
   177  			p = q;
   178  			p->as = ABL;
   179  			p->to.type = D_BRANCH;
   180  			p->cond = ps2;
   181  			p->to.sym = s2;
   182  
   183  			continue;
   184  		}
   185  		if(p->as == ARET) {
   186  			/*
   187  			 * RET
   188  			 */
   189  			q = prg();
   190  			q->as = ARET;
   191  			q->from = p->from;
   192  			q->to = p->to;
   193  			q->link = p->link;
   194  			p->link = q;
   195  
   196  			/*
   197  			 * BL	profout
   198  			 */
   199  			p->as = ABL;
   200  			p->from = zprg.from;
   201  			p->to = zprg.to;
   202  			p->to.type = D_BRANCH;
   203  			p->cond = ps4;
   204  			p->to.sym = s4;
   205  
   206  			p = q;
   207  
   208  			continue;
   209  		}
   210  	}
   211  }