Skip to content
  • Matthew Pickering's avatar
    Remove DT_Failed state · 753b921d
    Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
    At the moment if `-dynamic-too` fails then we rerun the whole pipeline
    as if we were just in `-dynamic` mode. I argue this is a misfeature and
    we should remove the so-called `DT_Failed` mode.
    
    In what situations do we fall back to `DT_Failed`?
    
    1. If the `dyn_hi` file corresponding to a `hi` file is missing completely.
    2. If the interface hash of `dyn_hi` doesn't match the interface hash of `hi`.
    
    What happens in `DT_Failed` mode?
    
    * The whole compiler pipeline is rerun as if the user had just passed `-dynamic`.
    * Therefore `dyn_hi/dyn_o` files are used which don't agree with the
      `hi/o` files. (As evidenced by `dynamicToo001` test).
    * This is very confusing as now a single compiler invocation has
      produced further `hi`/`dyn_hi` files which are different to each
      other.
    
    Why should we remove it?
    
    * In `--make` mode, which is predominately used `DT_Failed` does not
      work (#19782), there can't be users relying on this functionality.
    * In `-c` mode, the recovery doesn't fix the root issue, which is the
      `dyn_hi` and `hi` files are mismatched. We should instead produce an
      error and pass responsibility to the build system using `-c` to ensure
      that the prerequisites for `-dynamic-too` (dyn_hi/hi) files are there
      before we start compiling.
    * It is a misfeature to support use cases like `dynamicToo001` which
      allow you to mix different versions of dynamic/non-dynamic interface
      files. It's more likely to lead to subtle bugs in your resulting
      programs where out-dated build products are used rather than a
      deliberate choice.
    * In practice, people are usually compiling with `-dynamic-too` rather
      than separately with `-dynamic` and `-static`, so the build products
      always match and `DT_Failed` is only entered due to compiler bugs (see
      !6583)
    
    What should we do instead?
    
    * In `--make` mode, for home packages check during recompilation
      checking that `dyn_hi` and `hi` are both present and agree, recompile
      the modules if they do not.
    * For package modules, when loading the interface check that `dyn_hi`
      and `hi` are there and that they agree but fail with an
      error message if they are not.
    * In `--oneshot` mode, fail with an error message if the right files
      aren't already there.
    
    Closes #19782 #20446 #9176 #13616
    753b921d