Explorar el Código

Patch from Stefan Allius:

    Hi Erik,

    I patched the initfini.awk script, so we can build crt[in].S for the SuperH
    targets with gmon-support.

    The patch moves all labels into the wright sections, and add some assembler
    statements to jump over them. (only activ on SH targets)

    The patch also avoid any references of _GLOBAL_OFFSET_TABLE_ or *gmon_start*
    in the crtn.S file. This should work on every target.

    Bye Stefan
Eric Andersen hace 21 años
padre
commit
3993c94993
Se han modificado 1 ficheros con 31 adiciones y 11 borrados
  1. 31 11
      extra/scripts/initfini.awk

+ 31 - 11
extra/scripts/initfini.awk

@@ -12,7 +12,6 @@ BEGIN \
   system("/bin/rm -f crt[in].S");
   omitcrti=0;
   omitcrtn=0;
-  do_sh_specials = 0;
   glb_idx = 0;
   while(getline < "initfini.S")
   { if(/\.endp/) {endp=1}
@@ -20,22 +19,37 @@ BEGIN \
     if(/\.align/) {alignval=$2}
 # here comes some special stuff for the SuperH targets
 #  We search for all labels, which uses the _GLOBAL_OFFSET_TABLE_
-#  definition, and store them in the glb_label array.
-    if(/_GLOBAL_OFFSET_TABLE_/) {
-      glb_label[glb_idx] = last;
-      glb_idx += 1;
-      glb = $0;
+#  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==0 {omitcrti +=1;do_sh_specials++}
-/_init_SH_GLB/  && glb_idx>=1 {print glb_label[0] glb >> "crti.S"}
-/_fini_SH_GLB/  && glb_idx>=2 {print glb_label[1] glb >> "crti.S"}
-/SH_GLB_ENDS/   && glb_idx==0 {omitcrti -=1}
-/SH_GLB/ || /_GLOBAL_OFFSET_TABLE_/ && do_sh_specials>=1 {getline}
+/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}
 
@@ -55,6 +69,12 @@ BEGIN \
 /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)