diff --git a/ghc/driver/ghc-iface.lprl b/ghc/driver/ghc-iface.lprl index 1666b7866eccc7ecdf2a64d00989fd91bfa46c3f..02c079391e47b4ec188aa3ccec5c082cb2e88161 100644 --- a/ghc/driver/ghc-iface.lprl +++ b/ghc/driver/ghc-iface.lprl @@ -49,9 +49,21 @@ sub postprocessHiFile { } # if we produced an interface file "no matter what", - # print what we got on stderr (ToDo: honor -ohi flag) + # print what we got on stderr. if ( $HiOnStdout ) { - system("$Cat $new_hi 1>&2"); + if ( $HiWith ne '' ) { + # output some of the sections + local($hi_after) = "$Tmp_prefix.hi-now"; + + foreach $hi ( split(' ',$HiWith) ) { + $HiSection{$hi} = 1; + } + &hiSectionsOnly($new_hi, $hi_after); + + system("$Cat $hi_after 1>&2 ; $Rm $hi_after; "); + } else { + system("$Cat $new_hi 1>&2"); + } } else { &run_something("$Cmp -s $hifile_target $new_hi || ( $Rm $hifile_target && $Cp $new_hi $hifile_target )", "Replace .$HiSuffix file, if changed"); @@ -76,6 +88,32 @@ sub deUsagifyHi { } \end{code} +\begin{code} +sub hiSectionsOnly { + local($ifile,$ofile) = @_; + + open(OLDHIF, "< $ifile") || &tidy_up_and_die(1,"Can't open $ifile (read)\n"); + open(NEWHIF, "> $ofile") || &tidy_up_and_die(1,"Can't open $ofile (write)\n"); + + # read up to _usages_ line + $_ = <OLDHIF>; + while ($_ ne '' ) { + if ( /^__export/ && $HiSection {'exports'} || + /^import / && $HiSection {'imports'} || + /^\d+ ([^ ]+ :: |type |data |class |newtype )/ && $HiSection {'declarations'} || + /^instance / && $HiSection {'instances'} ) { + print NEWHIF $_; + $_ = <OLDHIF>; + } else { + $_ = <OLDHIF>; + } + } + + close(OLDHIF) || &tidy_up_and_die(1,"Failed reading from $ifile\n"); + close(NEWHIF) || &tidy_up_and_die(1,"Failed writing to $ofile\n"); +} +\end{code} + \begin{code} sub constructNewHiFile { local($hsc_hi, # The iface info produced by hsc. diff --git a/ghc/driver/ghc.lprl b/ghc/driver/ghc.lprl index 5d4bca7ed6984f1d55ba991ff9c935629191663a..b87d9b37e65a614fb08cef6826a54b266657e383 100644 --- a/ghc/driver/ghc.lprl +++ b/ghc/driver/ghc.lprl @@ -2792,6 +2792,8 @@ arg: while($_ = $Args[0]) { /^-hi$/ && do { $HiOnStdout = 1; $ProduceHi = '-hifile='; next arg; }; # _do_ generate an interface; usually used as: -noC -hi + /^-hi-with-(.*)$/ && do { $HiOnStdout = 1; $HiWith .= " $1" ; $ProduceHi = '-hifile='; next arg; }; + # limit ourselves to outputting a particular section. /^-nohi$/ && do { $ProduceHi = '-nohifile='; next arg; }; # don't generate an interface (even if generating C)