| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | #! /usr/bin/awk -f# Contributed by Christian MICHON <christian_michon@yahoo.fr> to#   eliminate the compile time dependancy on perl introduced by #   Erik's older initfini.pl # vim:ai:sw=2:BEGIN \{ alignval="";  endp=0;  end=0;  system("touch crt[in].S");  system("/bin/rm -f crt[in].S");  omitcrti=0;  omitcrtn=0;  glb_idx = 0;  while(getline < "initfini.S")  { if(/\.endp/) {endp=1}    if(/\.end/) {end=1}    if(/\.align/) {alignval=$2}# here comes some special stuff for the SuperH targets#  We search for all labels, which uses the _GLOBAL_OFFSET_TABLE_#  or a call_gmon_start function reference, and store#  them in the glb_label array.    if(/_init_EPILOG_BEGINS/) {glb_idx=1;glb_idx_arr[glb_idx]=0}    if(/_fini_EPILOG_BEGINS/) {glb_idx=2;glb_idx_arr[glb_idx]=0}    if(/EPILOG_ENDS/)         {glb_idx=0}    if(/_GLOBAL_OFFSET_TABLE_/||/call_gmon_start/) {      glb_label[glb_idx,glb_idx_arr[glb_idx]] = last;      glb_idx_arr[glb_idx] += 1;      glb_label[glb_idx,glb_idx_arr[glb_idx]] = $0;      glb_idx_arr[glb_idx] += 1;    }    last = $1;  }  close("initfini.S");}# special rules for the SuperH targets (They do nothing on other targets)/SH_GLB_BEGINS/ && glb_idx_arr[1]==0 && glb_idx_arr[2]==0 {omitcrti +=1}/_init_SH_GLB/  {glb_idx=1}/_fini_SH_GLB/  {glb_idx=2}/SH_GLB_ENDS/ {omitcrti -=1}/SH_GLB/ \{  if (glb_idx>0)    {      for (i=0;i<glb_idx_arr[glb_idx];i+=1) {	print glb_label[glb_idx,i] >> "crti.S";      }      glb_idx = 0;    }  next;}# special rules for H8/300 (sorry quick hack)/.h8300h/ {end=0}# rules for all targets/HEADER_ENDS/{omitcrti=1;omitcrtn=1;getline}/PROLOG_BEGINS/{omitcrti=0;omitcrtn=0;getline}/i_am_not_a_leaf/{getline}/_init:/||/_fini:/{omitcrtn=1}/PROLOG_PAUSES/{omitcrti=1;getline}/PROLOG_UNPAUSES/{omitcrti=0;getline}/PROLOG_ENDS/{omitcrti=1;getline}/EPILOG_BEGINS/{omitcrtn=0;getline}/EPILOG_ENDS/{omitcrtn=1;getline}/TRAILER_BEGINS/{omitcrti=0;omitcrtn=0;getline}/GMON_STUFF_BEGINS/{omitcrtn=1;getline}/GMON_STUFF_PAUSES/{omitcrtn=0;getline}/GMON_STUFF_UNPAUSES/{omitcrtn=1;getline}/GMON_STUFF_ENDS/{omitcrtn=0;getline}/_GLOBAL_OFFSET_TABLE_/||/gmon_start/ \{  if(omitcrti==0) {print >> "crti.S";}  next;  # no gmon_start or GLOBAL_OFFSET_TABLE references in crtn.S}/END_INIT/ \{ if(endp)  { gsub("END_INIT",".endp _init",$0)  }  else  { if(end)    { gsub("END_INIT",".end _init",$0)    }    else    { gsub("END_INIT","",$0)    }  }}/END_FINI/ \{ if(endp)  { gsub("END_FINI",".endp _fini",$0)  }  else  { if(end)    { gsub("END_FINI",".end _fini",$0)    }    else    { gsub("END_FINI","",$0)    }  }}/ALIGN/ \{ if(alignval!="")  { gsub("ALIGN",sprintf(".align %s",alignval),$0)  }  else  { gsub("ALIGN","",$0)  }}omitcrti==0 {print >> "crti.S"}omitcrtn==0 {print >> "crtn.S"}END \{ close("crti.S");  close("crtn.S");}
 |