X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fghc.lprl;h=6bd471bbc0d3059cc7dcf5235687ce986590be3c;hb=f4864daec1199b6e1664df48076dbaaca16b78d9;hp=77c505d9975dc382f52769e18aba521fd8997e8d;hpb=111cee3f1ad93816cb828e38b38521d85c3bcebb;p=ghc-hetmet.git diff --git a/ghc/driver/ghc.lprl b/ghc/driver/ghc.lprl index 77c505d..6bd471b 100644 --- a/ghc/driver/ghc.lprl +++ b/ghc/driver/ghc.lprl @@ -158,7 +158,14 @@ $SIG{'QUIT'} = 'quit_upon_signal'; : "$TopPwd/${CURRENT_DIR}" ); if ( $ENV{'TMPDIR'} ) { # where to make tmp file names - $Tmp_prefix = ($ENV{'TMPDIR'} . "/ghc$$"); + # Try to find a $Tmp_prefix which isn't being used... + $tmp = $$; + do { + $Tmp_prefix = ($ENV{'TMPDIR'} . "/ghc$tmp"); + $tmp++; + } while ( -e "$Tmp_prefix.hc" || + -e "$Tmp_Prefix.s" || + -e "$Tmp_Prefix.hi" ); } else { print STDERR "TMPDIR has not been set to anything useful!\n" if (${TMPDIR} eq ''); $Tmp_prefix ="${TMPDIR}/ghc$$"; # TMPDIR set via Makefile when booting.. @@ -462,12 +469,15 @@ $PostprocessCcOutput = 0; $Static = 1; $Static = 0 if ($EnableWin32DLLs eq 'YES'); -# native code-gen or via C? +# Output language $HaveNativeCodeGen = $GhcWithNativeCodeGen; -$HscOut = '-C='; # '-C=' ==> .hc output; '-S=' ==> .s output; '-N=' ==> neither -$HscOut = '-S=' - if ($HaveNativeCodeGen ne 'YES') && $TargetPlatform =~ /^(alpha)-/; -# TEMP: disable x86 & Sparc if $HaveNativeCodeGen && $TargetPlatform =~ /^(i386|alpha|sparc)-/; +$HscLang = 'C'; # 'C' ==> .hc output; + # 'asm' ==> .s output; + # 'java' ==> .java output + # 'none' ==> no code output +$HscLang = 'asm' + if ($HaveNativeCodeGen eq 'YES') && $TargetPlatform =~ /^(i386)-/; + $ProduceHi = '-hifile='; $HiOnStdout = 0; $HiWith = ''; @@ -677,12 +687,6 @@ The (outwards-)let-floater should be the {\em last} Core-to-Core pass that's run. (Um, well, howzabout the simplifier just once more...) \end{description} -STG-TO-STG PASSES: -\begin{description} -\item[\tr{-fupdate-analysis}:] -It really really wants to be the last STG-to-STG pass that is run. -\end{description} - \begin{code} sub setupOptimiseFlags { @@ -835,8 +839,7 @@ sub setupOptimiseFlags { # SPECIAL FLAGS for -O2 ($OptLevel == 2) ? ( - '-fupdate-analysis', # virtually useless; relegated to -O2 - '-fsemi-tagging', + # none at the present time ) : (), ); @@ -949,9 +952,9 @@ After the sanity checks, add flags to the necessary parts of the driver pipeline if ( $BuildTag ne '' ) { # something other than normal sequential... local($Tag) = "${BuildTag}"; - $Tag =~ s/_//; # move the underscore to the back + $Tag =~ s/_//; # move the underscore to the back - $HscOut = '-C='; # must go via C + $HscLang = 'C'; # must go via C &processArgs(split(' ', $SetupOpts{$BuildTag})); # eval($EvaldSetupOpts{$BuildTag}); } @@ -1147,14 +1150,13 @@ sub setupIncPaths { push (@Include_dir, "$TopPwd/${CURRENT_DIR}/${GHC_INCLUDE_DIR}"); } else { push (@Include_dir, "$InstLibDirGhc/includes"); - push (@Include_dir, "$InstLibDirGhc/includes"); } } # end of setupIncPaths \end{code} \begin{code} sub setupSyslibs { - push(@SysLibrary, ( '-lHS', '-lHS_cbits' )); # basic I/O and prelude stuff + push(@SysLibrary, ( '-lHSstd', '-lHSstd_cbits' )); # basic I/O and prelude stuff local($f); foreach $f (@SysLibrary) { @@ -1408,11 +1410,17 @@ Again, we'll do the post-recompilation-checker parts of this later. # local($do_cc) = ( $Do_cc != -1) # i.e., it was set explicitly ? $Do_cc - : ( ($HscOut eq '-C=') ? 1 : 0 ); + : ( ($HscLang eq 'C') ? 1 : 0 ); local($do_as) = $Do_as; - local($hsc_out) = ( $HscOut eq '-C=' ) ? "$Tmp_prefix.hc" : "$Tmp_prefix.s" ; - local($hsc_out_c_stub) = ( $HscOut eq '-C=' ) ? "${Tmp_prefix}_stb.c" : ""; - local($hsc_out_h_stub) = ( $HscOut eq '-C=' ) ? "${Tmp_prefix}_stb.h" : ""; + + local($hsc_out_suffix) = ( $HscLang eq 'C' ) ? "hc" : + ( $HscLang eq 'asm' ) ? "s" : + ( $HscLang eq 'java' ) ? "java" : + "" ; + + local($hsc_out) = "$Tmp_prefix.$hsc_out_suffix" ; + local($hsc_out_c_stub) = "${Tmp_prefix}_stb.c"; + local($hsc_out_h_stub) = "${Tmp_prefix}_stb.h"; if ($Only_preprocess_hc) { # stop after having run $Cc -E $do_as=0; @@ -1452,20 +1460,20 @@ not} going to run, set its input (i.e., the output of its preceding phase) to @"$ifile_root."@. \begin{code} - local($going_interactive) = $HscOut eq '-N=' || $ifile_root eq '_stdin'; + local($going_interactive) = $HscLang eq 'none' || $ifile_root eq '_stdin'; # # Warning issued if -keep-hc-file-too is used without # -fvia-C (or the equivalent) # - if ( $HscOut ne '-C=' && $Keep_hc_file_too ) { + if ( $HscLang ne 'C' && $Keep_hc_file_too ) { print STDERR "$Pgm: warning: Native code generator to be used, -keep-hc-file-too will be ignored\n"; } if (! $do_cc && ! $do_as) { # stopping after hsc $hsc_out = ($Specific_output_file ne '') ? $Specific_output_file - : &odir_ify($ifile_root, ($HscOut eq '-C=') ? 'hc' : 's'); + : &odir_ify($ifile_root, $hsc_out_suffix); $ofile_target = $hsc_out; # reset } @@ -1494,6 +1502,25 @@ Now the Haskell compiler, C compiler, and assembler &run_something("cp $hsc_out_h_stub $ofile_h_stub_target", 'Copy foreign export header file'); } + # + # Bring the C stub protos into scope when compiling the .hc file. + # + push (@CcInjects, "#include \"${hsc_out_h_stub}\"\n"); + # Hack - ensure that the stub .h file is included in the OPTIONS section + # if the .hc file is saved. + push (@File_options, "-#include \"${ofile_h_stub_target}\"\n"); + + if ($do_cc) { + &runGcc ($is_hc_file, $hsc_out, $cc_as_o); + &runMangler($is_hc_file, $cc_as_o, $cc_as, $ifile_root) if ! $Only_preprocess_hc; + } + + &split_asm_file($cc_as) if $do_as && $SplitObjFiles; + + # save a copy of the .s file.. + &saveIntermediate($ifile_root , "s" , $cc_as) if ($do_as && $Keep_s_file_too); + &runAs($as_out, $ifile_root) if $do_as; + if (-f $hsc_out_c_stub) { &run_something("rm -f $ofile_c_stub_target && echo '#include \"${ofile_h_stub_target}\"' > $ofile_c_stub_target && cat $hsc_out_c_stub >> $ofile_c_stub_target", 'Copy foreign export C stubs'); local ($hsc_out_s_stub); @@ -1502,30 +1529,12 @@ Now the Haskell compiler, C compiler, and assembler ($ofile_o_stub_target = $ofile_c_stub_target) =~ s/\.(.*)$//; $ofile_o_stub_target = &osuf_ify($ofile_o_stub_target, "o"); - if ($do_cc) { + if ($do_cc || $do_as) { # might be using NCG, so check $do_as &runGcc (0, $ofile_c_stub_target, $ofile_s_stub_target); &runAs ($ofile_o_stub_target, $ofile_s_stub_target); } - # - # Bring the C stub protos into scope when compiling the .hc file. - # - push (@CcInjects, "#include \"${hsc_out_h_stub}\"\n"); - # Hack - ensure that the stub .h file is included in the OPTIONS section - # if the .hc file is saved. - push (@File_options, "-#include \"${ofile_h_stub_target}\"\n"); - } - if ($do_cc) { - &runGcc ($is_hc_file, $hsc_out, $cc_as_o); - &runMangler($is_hc_file, $cc_as_o, $cc_as, $ifile_root) if ! $Only_preprocess_hc; - } - - &split_asm_file($cc_as) if $do_as && $SplitObjFiles; - - # save a copy of the .s file.. - &saveIntermediate($ifile_root , "s" , $cc_as) if ($do_as && $Keep_s_file_too); - &runAs($as_out, $ifile_root) if $do_as; \end{code} Finally, decide what to queue up for linker input. @@ -1680,7 +1689,7 @@ sub runHscAndProcessInterfaces { # recompiling this module has been done # &run_something("touch $ofile_target", - "Touch $ofile_target, to propagate dependencies") if $HscOut ne '-N='; + "Touch $ofile_target, to propagate dependencies") if $HscLang ne 'none'; } else { @@ -1689,18 +1698,20 @@ sub runHscAndProcessInterfaces { # If non-interactive, heave in the consistency info at the end # NB: pretty hackish (depends on how $output is set) if ( ! $going_interactive ) { - if ( $HscOut eq '-C=' ) { - $to_do = "echo 'static char ghc_hsc_ID[] = \"\@(#)hsc $ifile\t$HsC_major_version.$HsC_minor_version,$HsC_consist_options\";' >> $hsc_out"; + if ( $HscLang eq 'C' ) { + $to_do = "echo 'static char ghc_hsc_ID[] = \"\@(#)hsc $ifile\t$HsC_major_version.$HsC_minor_version,$HsC_consist_options\";' >> $hsc_out"; - } elsif ( $HscOut eq '-S=' ) { + &run_something($to_do, 'Pin on Haskell consistency info'); + } elsif ( $HscLang eq 'asm' ) { local($consist) = "hsc.$ifile.$HsC_major_version.$HsC_minor_version.$HsC_consist_options"; $consist =~ s/,/./g; $consist =~ s/\//./g; $consist =~ s/-/_/g; $consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly? $to_do = "echo '\n\t.text\n$consist:' >> $hsc_out"; + &run_something($to_do, 'Pin on Haskell consistency info'); } - &run_something($to_do, 'Pin on Haskell consistency info'); + # no consistency info for Java output files } @@ -1711,12 +1722,12 @@ sub runHscAndProcessInterfaces { } # if we're going to split up object files, # we inject split markers into the .hc file now - if ( $HscOut eq '-C=' && $SplitObjFiles ) { + if ( $HscLang eq 'C' && $SplitObjFiles ) { &inject_split_markers ( $hsc_out ); } # save a copy of the .hc file, even if we are carrying on... - if ($HscOut eq '-C=' && $do_cc && $Keep_hc_file_too) { + if ($HscLang eq 'C' && $do_cc && $Keep_hc_file_too) { &saveIntermediate($ifile_root , "hc" , $hsc_out); } @@ -1745,7 +1756,8 @@ sub runHsc { # set up for producing output/.hi; note that flag twiddling # may mean that nothing will actually be produced: - $output = "$ProduceHi$hsc_hi $HscOut$hsc_out -F=$hsc_out_c_stub -FH=$hsc_out_h_stub"; + $oflags = ( $HscLang eq 'none' ? "" : "-olang=$HscLang -ofile=$hsc_out" ) ; + $output = "$ProduceHi$hsc_hi $oflags -F=$hsc_out_c_stub -FH=$hsc_out_h_stub"; push(@Files_to_tidy, $hsc_hi, $hsc_out, $hsc_out_c_stub, $hsc_out_h_stub ); # if we're compiling foo.hs, we want the GC stats to end up in foo.stat @@ -2535,7 +2547,7 @@ sub add_syslib { : "$TopPwd/hslibs/concurrent" ) , '' # where to find the cbits archive to use when linking - , '' # Syslib dependencies + , 'lang' # Syslib dependencies , '' # extra ghc opts , '' # extra cc opts , '' # extra ld opts @@ -2641,10 +2653,10 @@ sub add_syslib { ? "$InstLibDirGhc" : "$TopPwd/hslibs/util/cbits" ) - , 'lang concurrent' # Syslib dependencies + , 'lang concurrent posix' # Syslib dependencies , '' # extra ghc opts , '' # extra cc opts - , '' # extra ld opts + , "$LibsReadline" # extra ld opts ], win32, @@ -2796,7 +2808,7 @@ sub splitCmdLine { arg: while($_ = $args[0]) { shift(@args); # sigh, we have to deal with these -option arg specially here. - /^-(tmpdir|odir|ohi|o|isuf|osuf|hisuf|odump|syslib)$/ && + /^-(tmpdir|odir|ohi|o|isuf|osuf|hisuf|odump|syslib|package|package-name)$/ && do { push(@Cmd_opts, $_); push(@Cmd_opts,$args[0]); shift(@args); next arg; }; /^--?./ && do { push(@Cmd_opts, $_); next arg; }; @@ -2887,11 +2899,15 @@ arg: while($_ = $Args[0]) { # change the global default: # we won't run cat; we'll run the real thing - /^-C$/ && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscOut = '-C='; + /^-C$/ && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscLang = 'C'; next arg; }; # stop after generating C - /^-noC$/ && do { $HscOut = '-N='; $ProduceHi = '-nohifile='; + /^-J$/ && do { $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; $HscLang = 'java'; + next arg; }; + # stop after generating Java + + /^-noC$/ && do { $HscLang = 'none'; $ProduceHi = '-nohifile='; $Do_cc = 0; $Do_as = 0; $Do_lnkr = 0; next arg; }; # leave out actual C generation (debugging) [also turns off interface gen] @@ -3089,10 +3105,21 @@ arg: while($_ = $Args[0]) { /^-L(.*)/ && do { push(@UserLibrary_dir, &grab_arg_arg(*Args,'-L', $1)); next arg; }; /^-l(.*)/ && do { push(@UserLibrary,'-l'.&grab_arg_arg(*Args,'-l', $1)); next arg; }; + # DEPRECATED: use -package instead /^-syslib(.*)/ && do { local($syslib) = &grab_arg_arg(*Args,'-syslib',$1); &add_syslib($syslib); next arg; }; + /^-package-name(.*)/ && do + { local($package) = &grab_arg_arg(*Args,'-package-name',$1); + push(@HsC_flags,"-inpackage=$package"); + next arg; + }; + + /^-package(.*)/ && do { local($package) = &grab_arg_arg(*Args,'-package',$1); + &add_syslib($package); + next arg; }; + #======================================================================= # various flags that we can harmlessly send to one program or another # (we will later "reclaim" some of the compiler ones now sent to gcc) @@ -3158,7 +3185,7 @@ arg: while($_ = $Args[0]) { print STDERR "WARNING: don't know how to split objects on this platform: $TargetPlatform\n`-split-objs' option ignored\n"; } else { $SplitObjFiles = 1; - $HscOut = '-C='; + $HscLang = 'C'; push(@HsC_flags, "-fglobalise-toplev-names"); push(@CcBoth_flags, '-DUSE_SPLIT_MARKERS'); @@ -3214,8 +3241,8 @@ arg: while($_ = $Args[0]) { # --------------- - /^-fasm-(.*)$/ && do { $HscOut = '-S='; next arg; }; # force using nativeGen - /^-fvia-[cC]$/ && do { $HscOut = '-C='; next arg; }; # force using C compiler + /^-fasm-(.*)$/ && do { $HscLang = 'asm'; next arg; }; # force using nativeGen + /^-fvia-[cC]$/ && do { $HscLang = 'C'; next arg; }; # force using C compiler # --------------- @@ -3387,7 +3414,7 @@ arg: while($_ = $Args[0]) { local($opt_lev) = ( /^-O2$/ ) ? 2 : 1; # max 'em $OptLevel = ( $opt_lev > $OptLevel ) ? $opt_lev : $OptLevel; - $HscOut = '-C=' if $OptLevel == 2; # force use of C compiler + $HscLang = 'C'; # force use of C compiler next arg; }; /^-Onot$/ && do { $OptLevel = 0; next arg; }; # # set it to