add casArray# primop, similar to casMutVar# but for array elements
Tweak stg_casArrayzh as per Simon Marlow's suggestion.
Update stg_casArrayzh to conform to new CMM conventions.
Add PrimOp: casIntArray#.  Modify casMutVar# for 'ticketed' style.
Add PrimOp fetchAddIntArray# plus supporting C function atomic_inc_by.
Eliminate atomic_inc_by and instead medofiy atomic_inc.
minor bugfix to casIntArray# and fetchAddIntArray#
Sync Cabal to upstream version 1.18 pre-release

Apart from bumping build-dep version bounds, `ghc-cabal` is adapted to
some minor Cabal API changes, and `bin-package-db` is made aware of
Cabal's recently added AGPL licence support.
Properly externalise codegen identifiers (#8166)

388e14e2 unfortunately broke a subtle invariant in the code generator:
when generating code for an application, names may need to be
externalised, in case you're building against something external with
was built with -split-objs.

We were never externalising the ids of the applied functions. This means
if the libraries are split and we call into them, then the compiler
won't may not generate correct ids when making references to functions
in the library (causing linker failure).

I'm not entirely sure how this didn't break everything, but it certainly
caused several failures for a bunch of people. I had to fiddle with my
tree a little to make this occur.

This should fix #8166.

Signed-off-by: Austin Seipp <aseipp@pobox.com>
UniqSupply: make mkSplitUniqSupply thread-safe

unsafeInterleaveIO is used instead of unsafeDupableInterleaveIO because
a mk_supply thunk that is simultaneously entered by two threads should
evaluate to the same UniqSupply.

The UniqSupply counter is now incremented atomically using the RTS's
atomic_inc().

To mitigate the extra overhead of unsafeInterleaveIO in the
single-threaded compiler, noDuplicate# is changed to exit early when
n_capabilities == 1.
TcRnMonad: make forkM thread-safe

A forkM'd action cannot safely share a UniqSupply with its parent.

[ Originally I resolved this issue in another way: by atomically
  updating env_us in newUnique/newUniqueSupply. But I think this
  (equivalent) change is more sensible. ]
FastString: make the string table thread-safe

While we're at it, consolidate duplicate code into a helper function and
strictify a few arguments.
SysTools: make various functions thread-safe
TidyPgm: Atomically update the NameCache in tidyTopName
Binary: Make lazyGet more thread-safe

All values read lazily from the same BinHandle share the same mutable
offset variable (_off_r). If two such lazy values are simultaneously
evaluated, the two threads will step over each other when writing to
_off_r.

Fortunately, for BinMem handles, making lazyGet thread-safe is simple:
just use a fresh off_r variable when deferring the call to getAt.

For BinIO handles, a race condition still exists because IO handles
contain their own mutable file pointer variable that gets clobbered in a
similar way that _off_r would. But GHC doesn't use BinIO handles anywhere
so this particular issue could be ignored for now.
TcEnv: Make mkWrapperName deterministic and thread-safe
Make stdout and stderr line-buffered

An unbuffered handle is very slow to output to and there doesn't seem to
be any reason to have these handles unbuffered.
Implement the parallel upsweep (#910)

The parallel upsweep is the parallel counterpart to the default
sequential upsweep. It attempts to compile modules in parallel by
subdividing the work of the upsweep into parts that can be executed
concurrently by multiple Haskell threads.

In order to enable the parallel upsweep, the user has to pass the -jN
flag to GHC, where N is an optional number denoting the number of jobs,
or modules, to compile in parallel, like with GNU make. In GHC this just
sets the number of capabilities to N.
Binary: eradicate BinIO handles

They are not used anywhere in the compiler.
Properly handle import loops in the parallel upsweep