[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 5 commits: GHCi: Improve response to unloading, loading and reloading modules

Marge Bot (@marge-bot) gitlab at gitlab.haskell.org
Mon Feb 26 17:27:30 UTC 2024



Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC


Commits:
d0829cc3 by Jade at 2024-02-26T12:27:08-05:00
GHCi: Improve response to unloading, loading and reloading modules

Fixes #13869

- - - - -
02047dbc by Zubin Duggal at 2024-02-26T12:27:10-05:00
rel-eng/fetch-gitlab.py: Fix name of aarch64 alpine 3_18 release job

- - - - -
c7e8e4e1 by Cheng Shao at 2024-02-26T12:27:12-05:00
hadrian/hie-bios: pass -j to hadrian

This commit passes -j to hadrian in the hadrian/hie-bios scripts. When
the user starts HLS in a fresh clone that has just been configured, it
takes quite a while for hie-bios to pick up the ghc flags and start
actual indexing, due to the fact that the hadrian build step defaulted
to -j1, so -j speeds things up and improve HLS user experience in GHC.
Also add -j flag to .ghcid to speed up ghcid, and sets the Windows
build root to .hie-bios which also works and unifies with other
platforms, the previous build root _hie-bios was missing from
.gitignore anyway.

- - - - -
fa306c35 by Cheng Shao at 2024-02-26T12:27:12-05:00
ci: enable parallelism in hadrian/ghci scripts

This commit enables parallelism when the hadrian/ghci scripts are
called in CI. The time bottleneck is in the hadrian build step, but
previously the build step wasn't parallelized.

- - - - -
7b6e4ea0 by Felix Yan at 2024-02-26T12:27:13-05:00
m4: Correctly detect GCC version

When calling as `cc`, GCC does not outputs lowercased "gcc" at least in 13.2.1 version here.

```
$ cc --version
cc (GCC) 13.2.1 20230801
...
```

This fails the check and outputs the confusing message: `configure: $CC is not gcc; assuming it's a reasonably new C compiler`

This patch makes it check for upper-cased "GCC" too so that it works correctly:

```
checking version of gcc... 13.2.1
```
- - - - -


23 changed files:

- .ghcid
- .gitlab-ci.yml
- .gitlab/rel_eng/fetch-gitlab-artifacts/fetch_gitlab.py
- docs/users_guide/9.10.1-notes.rst
- ghc/GHCi/UI.hs
- hadrian/hie-bios
- hadrian/hie-bios.bat
- m4/fp_gcc_version.m4
- testsuite/tests/driver/T8526/T8526.stdout
- testsuite/tests/ghci/prog018/prog018.stdout
- + testsuite/tests/ghci/scripts/T13869.script
- + testsuite/tests/ghci/scripts/T13869.stdout
- + testsuite/tests/ghci/scripts/T13869a.hs
- + testsuite/tests/ghci/scripts/T13869b.hs
- testsuite/tests/ghci/scripts/T13997.stdout
- testsuite/tests/ghci/scripts/T17669.stdout
- testsuite/tests/ghci/scripts/T1914.stdout
- testsuite/tests/ghci/scripts/T20217.stdout
- testsuite/tests/ghci/scripts/T20587.stdout
- testsuite/tests/ghci/scripts/T6105.stdout
- testsuite/tests/ghci/scripts/T8042.stdout
- testsuite/tests/ghci/scripts/all.T
- testsuite/tests/ghci/should_run/all.T


Changes:

=====================================
.ghcid
=====================================
@@ -1,4 +1,4 @@
---command sh ./hadrian/ghci
+--command sh -c "HADRIAN_ARGS=-j ./hadrian/ghci -j"
 --reload compiler
 --reload ghc
 --reload includes


=====================================
.gitlab-ci.yml
=====================================
@@ -402,7 +402,8 @@ hadrian-ghc-in-ghci:
     - "echo 'package hadrian'  > hadrian/cabal.project.local"
     - "echo '  ghc-options: -Werror'  >> hadrian/cabal.project.local"
     # Load ghc-in-ghci then immediately exit and check the modules loaded
-    - echo ":q" | hadrian/ghci -j`mk/detect-cpu-count.sh`| tail -n2 | grep "Ok,"
+    - export CORES="$(mk/detect-cpu-count.sh)"
+    - echo ":q" | HADRIAN_ARGS=-j$CORES hadrian/ghci -j$CORES | tail -n2 | grep "Ok,"
   after_script:
     - .gitlab/ci.sh save_cache
     - cat ci-timings
@@ -453,8 +454,9 @@ hadrian-multi:
     - .gitlab/ci.sh configure
     # Now GHC means, use this GHC for hadrian
     - export GHC=$BOOT_HC
+    - export CORES="$(mk/detect-cpu-count.sh)"
     # Load hadrian-multi then immediately exit and check the modules loaded
-    - echo ":q" | hadrian/ghci-multi -j`mk/detect-cpu-count.sh`| tail -n2 | grep "Ok,"
+    - echo ":q" | HADRIAN_ARGS=-j$CORES hadrian/ghci-multi -j$CORES | tail -n2 | grep "Ok,"
   after_script:
     - .gitlab/ci.sh save_cache
   cache:


=====================================
.gitlab/rel_eng/fetch-gitlab-artifacts/fetch_gitlab.py
=====================================
@@ -41,7 +41,7 @@ def job_triple(job_name):
         'release-armv7-linux-deb10-release': 'armv7-deb10-linux',
         'release-aarch64-linux-deb10-release': 'aarch64-deb10-linux',
         'release-aarch64-linux-deb11-release': 'aarch64-deb11-linux',
-        'release-aarch64-linux-alpine_3_18-release': 'aarch64-alpine3_18-linux',
+        'release-aarch64-linux-alpine3_18-release+no_split_sections': 'aarch64-alpine3_18-linux',
         'release-aarch64-darwin-release': 'aarch64-apple-darwin',
 
         'source-tarball': 'src',


=====================================
docs/users_guide/9.10.1-notes.rst
=====================================
@@ -194,6 +194,10 @@ WebAssembly backend
 GHCi
 ~~~~
 
+- GHCi now differentiates between adding, unadding, loading, unloading and reloading
+  in its responses to using the respective commands. The output with `-fshow-loaded-modules`
+  is not changed to keep backwards compatibility for tooling.
+
 Runtime system
 ~~~~~~~~~~~~~~
 


=====================================
ghc/GHCi/UI.hs
=====================================
@@ -1714,8 +1714,7 @@ changeDirectory dir = do
 trySuccess :: GhciMonad m => m SuccessFlag -> m SuccessFlag
 trySuccess act =
     handleSourceError (\e -> do printErrAndMaybeExit e -- immediately exit fith failure if in ghc -e
-                                return Failed) $ do
-      act
+                                pure Failed) act
 
 -----------------------------------------------------------------------------
 -- :edit
@@ -1913,7 +1912,7 @@ checkModule m = do
                         (text "local  names: " <+> ppr loc)
              _ -> empty
           return True
-  afterLoad (successIf ok) False
+  afterLoad (successIf ok) Check
 
 -----------------------------------------------------------------------------
 -- :doc
@@ -2018,6 +2017,13 @@ instancesCmd s = do
 -----------------------------------------------------------------------------
 -- :load, :add, :unadd, :reload
 
+-- these are mainly used for displaying a more informative response
+data LoadType = Add !Int | Unadd !Int | Load | Reload | Check
+
+isReload :: LoadType -> Bool
+isReload Reload = True
+isReload _      = False
+
 -- | Sets '-fdefer-type-errors' if 'defer' is true, executes 'load' and unsets
 -- '-fdefer-type-errors' again if it has not been set before.
 wrapDeferTypeErrors :: GHC.GhcMonad m => m a -> m a
@@ -2065,7 +2071,7 @@ loadModule' files = do
         clearCaches
 
         GHC.setTargets targets
-        doLoadAndCollectInfo False LoadAllTargets
+        doLoadAndCollectInfo Load LoadAllTargets
 
   if gopt Opt_GhciLeakCheck dflags
     then do
@@ -2088,7 +2094,7 @@ addModule files = do
   -- remove old targets with the same id; e.g. for :add *M
   mapM_ GHC.removeTarget [ tid | Target { targetId = tid } <- targets' ]
   mapM_ GHC.addTarget targets'
-  _ <- doLoadAndCollectInfo False LoadAllTargets
+  _ <- doLoadAndCollectInfo (Add $ length targets') LoadAllTargets
   return ()
   where
     checkTarget :: GhciMonad m => Target -> m Bool
@@ -2120,8 +2126,9 @@ unAddModule :: GhciMonad m => [FilePath] -> m ()
 unAddModule files = do
   files' <- mapM expandPath files
   targets <- mapM (\m -> GHC.guessTarget m Nothing Nothing) files'
-  mapM_ GHC.removeTarget [ tid | Target { targetId = tid } <- targets ]
-  _ <- doLoadAndCollectInfo False LoadAllTargets
+  let removals = [ tid | Target { targetId = tid } <- targets ]
+  mapM_ GHC.removeTarget removals
+  _ <- doLoadAndCollectInfo (Unadd $ length removals) LoadAllTargets
   return ()
 
 -- | @:reload@ command
@@ -2129,7 +2136,7 @@ reloadModule :: GhciMonad m => String -> m ()
 reloadModule m = do
   session <- GHC.getSession
   let home_unit = homeUnitId (hsc_home_unit session)
-  ok <- doLoadAndCollectInfo True (loadTargets home_unit)
+  ok <- doLoadAndCollectInfo Reload (loadTargets home_unit)
   when (failed ok) failIfExprEvalMode
   where
     loadTargets hu | null m    = LoadAllTargets
@@ -2150,11 +2157,11 @@ reloadModuleDefer = wrapDeferTypeErrors . reloadModule
 -- since those commands are designed to be used by editors and
 -- tooling, it's useless to collect this data for normal GHCi
 -- sessions.
-doLoadAndCollectInfo :: GhciMonad m => Bool -> LoadHowMuch -> m SuccessFlag
-doLoadAndCollectInfo retain_context howmuch = do
+doLoadAndCollectInfo :: GhciMonad m => LoadType -> LoadHowMuch -> m SuccessFlag
+doLoadAndCollectInfo load_type howmuch = do
   doCollectInfo <- isOptionSet CollectInfo
 
-  doLoad retain_context howmuch >>= \case
+  doLoad load_type howmuch >>= \case
     Succeeded | doCollectInfo -> do
       mod_summaries <- GHC.mgModSummaries <$> getModuleGraph
       -- MP: :set +c code path only works in single package mode atm, hence
@@ -2164,11 +2171,11 @@ doLoadAndCollectInfo retain_context howmuch = do
       v <- mod_infos <$> getGHCiState
       !newInfos <- collectInfo v loaded
       modifyGHCiState (\st -> st { mod_infos = newInfos })
-      return Succeeded
-    flag -> return flag
+      pure Succeeded
+    flag -> pure flag
 
-doLoad :: GhciMonad m => Bool -> LoadHowMuch -> m SuccessFlag
-doLoad retain_context howmuch = do
+doLoad :: GhciMonad m => LoadType -> LoadHowMuch -> m SuccessFlag
+doLoad load_type howmuch = do
   -- turn off breakpoints before we load: we can't turn them off later, because
   -- the ModBreaks will have gone away.
   discardActiveBreakPoints
@@ -2177,31 +2184,31 @@ doLoad retain_context howmuch = do
   -- Enable buffering stdout and stderr as we're compiling. Keeping these
   -- handles unbuffered will just slow the compilation down, especially when
   -- compiling in parallel.
-  MC.bracket (liftIO $ do hSetBuffering stdout LineBuffering
-                          hSetBuffering stderr LineBuffering)
-             (\_ ->
-              liftIO $ do hSetBuffering stdout NoBuffering
-                          hSetBuffering stderr NoBuffering) $ \_ -> do
+  let setBuffering t = liftIO $ do
+        hSetBuffering stdout t
+        hSetBuffering stderr t
+  MC.bracket_ (setBuffering LineBuffering) (setBuffering NoBuffering) $ do
       hmis <- ifaceCache <$> getGHCiState
       -- If GHCi message gets its own configuration at some stage then this will need to be
       -- modified to 'embedUnknownDiagnostic'.
       ok <- trySuccess $ GHC.loadWithCache (Just hmis) (mkUnknownDiagnostic . GHCiMessage) howmuch
-      afterLoad ok retain_context
-      return ok
+      afterLoad ok load_type
+      pure ok
+
 
 
 afterLoad
   :: GhciMonad m
   => SuccessFlag
-  -> Bool   -- keep the remembered_ctx, as far as possible (:reload)
+  -> LoadType
   -> m ()
-afterLoad ok retain_context = do
+afterLoad ok load_type = do
   revertCAFs  -- always revert CAFs on load.
   discardTickArrays
   loaded_mods <- getLoadedModules
-  modulesLoadedMsg ok loaded_mods
+  modulesLoadedMsg ok loaded_mods load_type
   graph <- GHC.getModuleGraph
-  setContextAfterLoad retain_context (Just graph)
+  setContextAfterLoad (isReload load_type) (Just graph)
 
 setContextAfterLoad :: GhciMonad m => Bool -> Maybe GHC.ModuleGraph -> m ()
 setContextAfterLoad keep_ctxt Nothing = do
@@ -2285,35 +2292,49 @@ keepPackageImports = filterM is_pkg_import
 
 
 
-modulesLoadedMsg :: GHC.GhcMonad m => SuccessFlag -> [GHC.ModSummary] -> m ()
-modulesLoadedMsg ok mods = do
+modulesLoadedMsg :: GHC.GhcMonad m => SuccessFlag -> [GHC.ModSummary] -> LoadType -> m ()
+modulesLoadedMsg ok mods load_type = do
   dflags <- getDynFlags
-  msg <- if gopt Opt_ShowLoadedModules dflags
-         then do
-               mod_names <- mapM mod_name mods
-               let mod_commas
-                     | null mods = text "none."
-                     | otherwise = hsep (punctuate comma mod_names) <> text "."
-               return $ status <> text ", modules loaded:" <+> mod_commas
-         else do
-               return $ status <> text ","
-                    <+> speakNOf (length mods) (text "module") <+> "loaded."
-
   when (verbosity dflags > 0) $ do
-     rendered_msg <- showSDocForUser' msg
+     mod_names <- mapM mod_name mods
+     rendered_msg <- showSDocForUser' $
+       if gopt Opt_ShowLoadedModules dflags
+         then loaded_msg mod_names
+         else msg
      liftIO $ putStrLn rendered_msg
   where
-    status = case ok of
-                  Failed    -> text "Failed"
-                  Succeeded -> text "Ok"
+    num_mods = length mods
+    none_loaded = num_mods == 0
+
+    loaded_msg names =
+      let mod_commas
+           | null mods = text "none."
+           | otherwise = hsep (punctuate comma names) <> text "."
+      in status <> text ", modules loaded:" <+> mod_commas
+
+    msg  = status <> comma <+> msg' <> dot
+    msg' = case load_type of
+      Reload  -> if none_loaded
+                   then "no modules to be reloaded"
+                   else n_mods num_mods "reloaded"
+      Load    -> if none_loaded
+                   then "unloaded all modules"
+                   else n_mods num_mods "loaded"
+      Check   -> n_mods 1 "checked"
+      Add   n -> n_mods n "added"
+      Unadd n -> n_mods n "unadded"
+    n_mods amount action = speakNOf amount "module" <+> action
+
+    status | Succeeded <- ok = "Ok"
+           | otherwise       = "Failed"
 
     mod_name mod = do
         is_interpreted <- GHC.moduleIsBootOrNotObjectLinkable mod
-        return $ if is_interpreted
-                 then ppr (GHC.ms_mod mod)
-                 else ppr (GHC.ms_mod mod)
-                      <+> parens (text $ normalise $ msObjFilePath mod)
-                      -- Fix #9887
+        pure $ if is_interpreted
+               then ppr (GHC.ms_mod mod)
+               else ppr (GHC.ms_mod mod)
+                    <+> parens (text $ normalise $ msObjFilePath mod)
+                    -- Fix #9887
 
 -- | Run an 'ExceptT' wrapped 'GhcMonad' while handling source errors
 -- and printing 'throwE' strings to 'stderr'. If in expression


=====================================
hadrian/hie-bios
=====================================
@@ -3,5 +3,4 @@
 # When run, this program will output a list of arguments which are necessary to
 # load the GHC library component into GHCi. The program is used by `ghcide` in
 # order to automatically set up the correct GHC API session for a project.
-TERM=dumb CABFLAGS=-v0 TOOL_OUTPUT=$HIE_BIOS_OUTPUT $PWD/hadrian/build-cabal tool:$1 -q --build-root=.hie-bios --flavour=ghc-in-ghci
-
+TERM=dumb CABFLAGS=-v0 TOOL_OUTPUT=$HIE_BIOS_OUTPUT $PWD/hadrian/build-cabal tool:$1 -q --build-root=.hie-bios --flavour=ghc-in-ghci -j


=====================================
hadrian/hie-bios.bat
=====================================
@@ -1,4 +1,4 @@
 set TERM=dumb
 set CABFLAGS=-v0
 set TOOL_OUTPUT=%HIE_BIOS_OUTPUT%
-%CD%\hadrian\build-cabal.bat tool:%1 --build-root=_hie-bios --flavour=ghc-in-ghci
+%CD%\hadrian\build-cabal.bat tool:%1 --build-root=.hie-bios --flavour=ghc-in-ghci -j


=====================================
m4/fp_gcc_version.m4
=====================================
@@ -8,7 +8,7 @@ AC_DEFUN([FP_GCC_VERSION], [
     AC_MSG_ERROR([C compiler is required])
   fi
 
-  if $CC --version | grep -q gcc; then
+  if $CC --version | grep -qi gcc; then
     AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
     [
         # Be sure only to look at the first occurrence of the "version " string;


=====================================
testsuite/tests/driver/T8526/T8526.stdout
=====================================
@@ -2,5 +2,5 @@
 Ok, one module loaded.
 True
 [1 of 1] Compiling A                ( A.hs, interpreted )
-Ok, one module loaded.
+Ok, one module reloaded.
 False


=====================================
testsuite/tests/ghci/prog018/prog018.stdout
=====================================
@@ -22,4 +22,4 @@ Failed, two modules loaded.
 
 C.hs:6:7: error: [GHC-88464]
     Variable not in scope: variableNotInScope :: ()
-Failed, two modules loaded.
+Failed, two modules reloaded.


=====================================
testsuite/tests/ghci/scripts/T13869.script
=====================================
@@ -0,0 +1,13 @@
+:set -v1
+:load T13869a.hs
+:reload
+
+:load
+:reload
+
+:load T13869a.hs
+:add T13869b.hs
+:reload
+
+:load T13869a.hs T13869b.hs
+:unadd T13869.hs


=====================================
testsuite/tests/ghci/scripts/T13869.stdout
=====================================
@@ -0,0 +1,14 @@
+[1 of 1] Compiling T13869A          ( T13869a.hs, interpreted )
+Ok, one module loaded.
+Ok, one module reloaded.
+Ok, unloaded all modules.
+Ok, no modules to be reloaded.
+[1 of 1] Compiling T13869A          ( T13869a.hs, interpreted )
+Ok, one module loaded.
+[2 of 2] Compiling T13869B          ( T13869b.hs, interpreted )
+Ok, one module added.
+Ok, two modules reloaded.
+[1 of 2] Compiling T13869A          ( T13869a.hs, interpreted )
+[2 of 2] Compiling T13869B          ( T13869b.hs, interpreted )
+Ok, two modules loaded.
+Ok, one module unadded.


=====================================
testsuite/tests/ghci/scripts/T13869a.hs
=====================================
@@ -0,0 +1 @@
+module T13869A where


=====================================
testsuite/tests/ghci/scripts/T13869b.hs
=====================================
@@ -0,0 +1 @@
+module T13869B where


=====================================
testsuite/tests/ghci/scripts/T13997.stdout
=====================================
@@ -4,5 +4,5 @@ Ok, two modules loaded.
 [1 of 3] Compiling New              ( New.hs, New.o )
 [2 of 3] Compiling Bug2             ( Bug2.hs, Bug2.o ) [Source file changed]
 [3 of 3] Compiling Bug              ( Bug.hs, Bug.o ) [Bug2 changed]
-Ok, three modules loaded.
+Ok, three modules reloaded.
 True


=====================================
testsuite/tests/ghci/scripts/T17669.stdout
=====================================
@@ -2,5 +2,5 @@
 Ok, one module loaded.
 this
 [1 of 1] Compiling T17669           ( T17669.hs, T17669.o ) [Source file changed]
-Ok, one module loaded.
+Ok, one module reloaded.
 that


=====================================
testsuite/tests/ghci/scripts/T1914.stdout
=====================================
@@ -2,6 +2,6 @@
 [2 of 2] Compiling T1914A           ( T1914A.hs, interpreted )
 Ok, two modules loaded.
 [2 of 2] Compiling T1914A           ( T1914A.hs, interpreted ) [Source file changed]
-Failed, one module loaded.
+Failed, one module reloaded.
 [2 of 2] Compiling T1914A           ( T1914A.hs, interpreted )
-Ok, two modules loaded.
+Ok, two modules reloaded.


=====================================
testsuite/tests/ghci/scripts/T20217.stdout
=====================================
@@ -2,4 +2,4 @@
 [2 of 3] Compiling T20217A          ( T20217A.hs, nothing )
 [3 of 3] Compiling T20217           ( T20217.hs, nothing )
 Ok, three modules loaded.
-Ok, three modules loaded.
+Ok, three modules reloaded.


=====================================
testsuite/tests/ghci/scripts/T20587.stdout
=====================================
@@ -1,4 +1,4 @@
 [1 of 1] Compiling B
 Ok, one module loaded.
 [1 of 1] Compiling B [Source file changed]
-Ok, one module loaded.
+Ok, one module reloaded.


=====================================
testsuite/tests/ghci/scripts/T6105.stdout
=====================================
@@ -1,4 +1,4 @@
 [1 of 1] Compiling T6105            ( T6105.hs, interpreted )
 Ok, one module loaded.
 [1 of 1] Compiling T6105            ( T6105.hs, interpreted )
-Ok, one module loaded.
+Ok, one module reloaded.


=====================================
testsuite/tests/ghci/scripts/T8042.stdout
=====================================
@@ -3,7 +3,7 @@
 [3 of 3] Compiling T8042A           ( T8042A.hs, interpreted )
 Ok, three modules loaded.
 [3 of 3] Compiling T8042A           ( T8042A.hs, T8042A.o ) [Source file changed]
-Ok, three modules loaded.
+Ok, three modules reloaded.
 [2 of 3] Compiling T8042C           ( T8042C.hs, interpreted )
 [3 of 3] Compiling T8042A           ( T8042A.hs, interpreted )
 Ok, three modules loaded.


=====================================
testsuite/tests/ghci/scripts/all.T
=====================================
@@ -380,4 +380,5 @@ test('T22817', normal, ghci_script, ['T22817.script'])
 test('T22908', normal, ghci_script, ['T22908.script'])
 test('T23062', normal, ghci_script, ['T23062.script'])
 test('T16468', normal, ghci_script, ['T16468.script'])
-test('T23686', normal, ghci_script, ['T23686.script'])
\ No newline at end of file
+test('T23686', normal, ghci_script, ['T23686.script'])
+test('T13869', extra_files(['T13869a.hs', 'T13869b.hs']), ghci_script, ['T13869.script'])


=====================================
testsuite/tests/ghci/should_run/all.T
=====================================
@@ -94,4 +94,3 @@ test('GhciMainIs', just_ghci, compile_and_run, ['-main-is otherMain'])
 test('LargeBCO', [extra_files(['LargeBCO_A.hs']), req_interp, extra_hc_opts("-O -fbyte-code-and-object-code -fprefer-byte-code")], compile_and_run, [''])
 
 test('T24115', just_ghci + [extra_run_opts("-e ':add T24115.hs'")], ghci_script, ['T24115.script'])
-



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/702b4842e12e2a43f714978823d022d72cd536dc...7b6e4ea09df0453d00bc3955ce210ce5777f38a1

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/702b4842e12e2a43f714978823d022d72cd536dc...7b6e4ea09df0453d00bc3955ce210ce5777f38a1
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20240226/d9f6bb01/attachment-0001.html>


More information about the ghc-commits mailing list