| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| | | |
| | | |
| | | |
| | | | |
The flag no longer exists, but we always behave as if it had been used.
|
| | | | |
|
|/ / /
| | |
| | |
| | | |
Fixes Trac #5141. Thanks to Adam Megacz.
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | | |
I don't know why these were left out. I did the obvious
thing... I hope it's right!
|
| | |
| | |
| | |
| | |
| | | |
This matters for constructors and field labels that
have a trailing hash (MagicHash language extension).
|
| | |
| | |
| | |
| | | |
Also a small refactoring in how the verbosity flag is handled.
|
| | |
| | |
| | |
| | | |
This reverts commit 2ec796239b782505cfb305af2789abcfa820baaf.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This assignment rewriting pass subsumes the previous reload
sinking pass, and also performs basic inlining.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| | |
| | |
| | |
| | | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| | |
| | |
| | |
| | | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| |/
|/|
| |
| | |
otherwise some versions of gcc complain about a missing final newline.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This fixes two bugs:
- The new code generator doesn't like procedures with
empty graphs, and panicked in labelAGraph.
- LLVM optimizes away empty procedures but not empty
data sections, so now the backwards-compatibility
labels actually work with -fllvm.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| |
| |
| |
| |
| |
| |
| | |
Renamed adjustUFM in GraphOps to adjustUFM_C, to account
for alternate argument order.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| |
| |
| |
| | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|/
|
|
| |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously the code generator generated small code fragments labelled
with __stginit_M for each module M, and these performed whatever
initialisation was necessary for that module and recursively invoked
the initialisation functions for imported modules. This appraoch had
drawbacks:
- FFI users had to call hs_add_root() to ensure the correct
initialisation routines were called. This is a non-standard,
and ugly, API.
- unless we were using -split-objs, the __stginit dependencies would
entail linking the whole transitive closure of modules imported,
whether they were actually used or not. In an extreme case (#4387,
#4417), a module from GHC might be imported for use in Template
Haskell or an annotation, and that would force the whole of GHC to
be needlessly linked into the final executable.
So now instead we do our initialisation with C functions marked with
__attribute__((constructor)), which are automatically invoked at
program startup time (or DSO load-time). The C initialisers are
emitted into the stub.c file. This means that every time we compile
with -prof or -hpc, we now get a stub file, but thanks to #3687 that
is now invisible to the user.
There are some refactorings in the RTS (particularly for HPC) to
handle the fact that initialisers now get run earlier than they did
before.
The __stginit symbols are still generated, and the hs_add_root()
function still exists (but does nothing), for backwards compatibility.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This code has accumulated a great deal of cruft over the years, this
pass cleans up a lot of the surrounding cruft but leaves the actual
argument processing alone - so there's still more that could be done.
Bug fixed:
- ghc_rts_opts should not be subject to the --rtsopts setting. If
the programmer explicitly declares options with ghc_rts_opts, they
shouldn't also have to accept command-line RTS options to make them
work.
|
|
|
|
|
|
|
| |
Warning: This change seems to tickle a bug in ghc-stage1 compiler
built with GHC 6.12.1 during validates.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|
|
|
| |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|
|
|
| |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The new code generator was doing some interesting spilling across
unsafe foreign calls:
_c1ao::I32 = Hp - 4;
I32[Sp - 20] = _c1ao::I32;
foreign "ccall"
newCAF((BaseReg, PtrHint), (R1, PtrHint))[_unsafe_call_];
_c1ao::I32 = I32[Sp - 20];
This is fairly unnecessary, and resulted from over-conservative
liveness analysis from CmmLive. We can see that the old code
generator only saved volatile registers across unsafe foreign calls:
spilling variables was done by saveVolatileVarsAndRegs, which was
only performed for ordinary calls.
This commit removes the excess kill from the liveness analysis, as well
as the *redundant* excess kill from spilling-and-reloading, and adds a
note to CmmNode to this effect. The only registers we need to kill
are the ones that the foreign call assigns to, just like any other
machine instruction.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A common sequence of commands (at least for me) is this:
$ ghc hello
1 of 1] Compiling Main ( hello.hs, hello.o )
Linking hello ...
$ ./hello +RTS -s
hello: Most RTS options are disabled. Link with -rtsopts to enable them.
$ ghc hello -rtsopts
$
grr, nothing happened. I could use -fforce-recomp, but if this was a
large program I probably don't want to recompile it all again, so:
$ rm hello
removed `hello'
$ ghc hello -rtsopts
Linking hello ...
$ ./hello +RTS -s
./hello +RTS -s
Hello World!
51,264 bytes allocated in the heap
2,904 bytes copied during GC
43,808 bytes maximum residency (1 sample(s))
17,632 bytes maximum slop
etc.
With this patch, GHC notices when the options have changed and forces
a relink, so you don't need to rm the binary or use -fforce-recomp.
This is done by adding the pertinent stuff to the binary in a special
section called ".debug-ghc-link-info":
$ readelf -p .debug-ghc-link-info ./hello
String dump of section 'ghc-linker-opts':
[ 0] (["-lHSbase-4.3.1.0","-lHSinteger-gmp-0.2.0.2","-lgmp","-lHSghc-prim-0.2.0.0","-lHSrts","-lm","-lrt","-ldl","-u","ghczmprim_GHCziTypes_Izh_static_info","-u","ghczmprim_GHCziTypes_Czh_static_info","-u","ghczmprim_GHCziTypes_Fzh_static_info","-u","ghczmprim_GHCziTypes_Dzh_static_info","-u","base_GHCziPtr_Ptr_static_info","-u","base_GHCziWord_Wzh_static_info","-u","base_GHCziInt_I8zh_static_info","-u","base_GHCziInt_I16zh_static_info","-u","base_GHCziInt_I32zh_static_info","-u","base_GHCziInt_I64zh_static_info","-u","base_GHCziWord_W8zh_static_info","-u","base_GHCziWord_W16zh_static_info","-u","base_GHCziWord_W32zh_static_info","-u","base_GHCziWord_W64zh_static_info","-u","base_GHCziStable_StablePtr_static_info","-u","ghczmprim_GHCziTypes_Izh_con_info","-u","ghczmprim_GHCziTypes_Czh_con_info","-u","ghczmprim_GHCziTypes_Fzh_con_info","-u","ghczmprim_GHCziTypes_Dzh_con_info","-u","base_GHCziPtr_Ptr_con_info","-u","base_GHCziPtr_FunPtr_con_info","-u","base_GHCziStable_StablePtr_con_info","-u","ghczmprim_GHCziTypes_False_closure","-u","ghczmprim_GHCziTypes_True_closure","-u","base_GHCziPack_unpackCString_closure","-u","base_GHCziIOziException_stackOverflow_closure","-u","base_GHCziIOziException_heapOverflow_closure","-u","base_ControlziExceptionziBase_nonTermination_closure","-u","base_GHCziIOziException_blockedIndefinitelyOnMVar_closure","-u","base_GHCziIOziException_blockedIndefinitelyOnSTM_closure","-u","base_ControlziExceptionziBase_nestedAtomically_closure","-u","base_GHCziWeak_runFinalizzerBatch_closure","-u","base_GHCziTopHandler_runIO_closure","-u","base_GHCziTopHandler_runNonIO_closure","-u","base_GHCziConcziIO_ensureIOManagerIsRunning_closure","-u","base_GHCziConcziSync_runSparks_closure","-u","base_GHCziConcziSignal_runHandlers_closure","-lHSffi"],Nothing,RtsOptsAll,False,[],[])
And GHC itself uses the readelf command to extract it when deciding
whether to relink. The reason for the name ".debug-ghc-link-info" is
that sections beginning with ".debug" are removed automatically by
strip.
This currently only works on Linux; Windows and OS X still have the
old behaviour.
|
|
|
|
|
| |
not the _stub.c file, because the latter is now created as a temporary
file.
|
|\ |
|
| |
| |
| |
| |
| | |
We collect variables introduced by the {...} part of a let-like record wildcard
pattern and do not warn if the user then doesn't actually use them.
|
| |
| |
| |
| | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|\ \
| | |
| | |
| | |
| | | |
* origin:
Revert "Suppress dumpTcRn when -dno-debug-output is enabled."
|
| | |
| | |
| | |
| | | |
This reverts commit 12929a219671cd7794b5a533cebdfef11d2f8ff4.
|
|\ \ \
| |/ /
|/| |
| | |
| | |
| | |
| | |
| | | |
* 'trac_5025' of https://github.com/thoughtpolice/ghc:
Teach GHC to compile objective-c files; trac #5025
Conflicts:
compiler/main/DriverPipeline.hs
|
| | | |
|
| | |
| | |
| | |
| | | |
to the way stub files were handled.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This change may constitute a substantial performance hit, due to the new
creation of a set for every instruction we emit.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| | |
| | |
| | |
| | | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
|\ \ \ |
|
| | | |
| | | |
| | | |
| | | | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| | | | |
|
| | | | |
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Now GHC still generates the _stub.c files, but the object file is
automatically merged into the main .o file for a module. This means
that build systems (including GHC's own) no longer need to worry about
looking for _stub.o files and including them when linking.
I had to do lots of refactoring in DriverPipeline to make this work;
now there's a monad to carry around all the information, and
everything is a lot tidier.
The _stub.c is now created as a temporary file and removed after
compilation (unless the -keep-tmp-files flag is on).
|
|/ / / |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
When we read a temporary value from memory, we should update its
assignment to be both in memory and in register. This was only
occurring when there was a free register, but not if we needed
to spill an existing value in a register to the stack. I generalized
the code for this case and applied it to the other two cases where
this occurs (spilled value is in memory and in a register, and when
the spilled value is only in a register.)
Furthermore, I tightened the invariants on allocRegsAndSpill_spill
with a new data type SpillLoc that captures more precisely than
Maybe Loc the possible locations we are spilling from.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|
| | | |
|
| | |
| | |
| | |
| | | |
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
|