From f5c54ab379ec951275aa935e2d4854df41a58409 Mon Sep 17 00:00:00 2001
From: simonmar <unknown>
Date: Tue, 18 Apr 2000 16:44:46 +0000
Subject: [PATCH] [project @ 2000-04-18 16:44:46 by simonmar] Push directives
 over literal chunks when attempting to move them to the following chunk on
 x86.  Occasionally gcc generates a .glob directive some distance before the
 symbol it refers to, and we were ending up with a whole load of .glob
 directives attached to strings, and duplicated in each .o file when
 splitting.

This change reduces the size of my libHSstd_p.a from 43M (!!!) to 9M.
I think this problem must have appeared with gcc 2.95.2, but it's a
little strange that I didn't notice it until now.
---
 ghc/driver/ghc-asm.lprl | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/ghc/driver/ghc-asm.lprl b/ghc/driver/ghc-asm.lprl
index 93c1c3a12abf..4b221fe9ffb4 100644
--- a/ghc/driver/ghc-asm.lprl
+++ b/ghc/driver/ghc-asm.lprl
@@ -782,7 +782,28 @@ sub mangle_asm {
 				                           # (this SEGVs perl4 on alphas, you see)
 
 	    $to_move = $1;
-	    if ( $i < ($numchks - 1)
+
+	    # on x86 we try not to copy any directives into a literal
+	    # chunk, rather we keep looking for the next real chunk.  This
+	    # is because we get things like
+	    #
+	    #    .globl blah_closure
+	    #    .LC32
+	    #    	.string "..."
+	    #    blah_closure:
+	    #		...
+            #
+	    if ( $TargetPlatform =~ /^i386/ && $to_move =~ /$TCOPYDIRVS/ ) {
+		$j = $i + 1;
+		while ( $j < ($numchks - 1)  && $chk[$j] =~ /$T_CONST_LBL/) {
+			$j++;
+		}
+		if ( $j < ($numchks - 1)) {
+			$chk[$j] = $to_move . $chk[$j];
+	        }
+	    }
+
+	    elsif ( $i < ($numchks - 1)
 	      && ( $to_move =~ /$TCOPYDIRVS/
 	        || ($TargetPlatform =~ /^hppa/ && $to_move =~ /align/ && $chkcat[$i+1] eq 'literal') )) {
 		$chk[$i + 1] = $to_move . $chk[$i + 1];
-- 
GitLab