<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/73394>73394</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `parseASanPassOptions` does not check for `"recover"` option
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          graphitemaster
      </td>
    </tr>
</table>

<pre>
    In the new pass pipeline there is no handling of `"recover"` in `parseASanPassOptions` so stuff like `asan<recover>` cannot be used. This makes it hard to use ASan from the C API since the only method for running passes is `LLVMRunPasses` which takes a pass pipeline string.

Simple hand-written diff here enables it.
```diff
MODULE_PASS_WITH_PARAMS("asan",
 "AddressSanitizerPass",
 [](AddressSanitizerOptions Opts) {
                          return AddressSanitizerPass(Opts);
                        },
 parseASanPassOptions,
-                       "kernel")
+ "kernel;recover")
```

```diff
Expected<AddressSanitizerOptions> parseASanPassOptions(StringRef Params) {
  AddressSanitizerOptions Result;
  while (!Params.empty()) {
    StringRef ParamName;
 std::tie(ParamName, Params) = Params.split(';');

    if (ParamName == "kernel") {
      Result.CompileKernel = true;
-   } else {
+   } else if (ParamName == "recover") {
+     Result.Recover = true;
+   } else {
      return make_error<StringError>(
 formatv("invalid AddressSanitizer pass parameter '{0}' ", ParamName)
 .str(),
          inconvertibleErrorCode());
    }
  }
 return Result;
}
```

Now one can use `"asan<recover>"` and the appropriate
```
ASAN_OPTIONS=halt_on_error=0
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVU9z-jYQ_TTishPGSIDxwQcHyDTT_GFC2h4ZYa-xGlnySHLS9NN3JJtAHOgvkwEkrd6-3ber5daKg0JMyeyWzFYj3rpKm_RgeFMJhzW3Ds1or4vP9F6BqxAUfkDDrYVGNCiFQr9rEIQFpaHiqpBCHUCXQOYRodRgrt_REErJPAKh_HbDjcVsy9WGW_vcOKGV9adWg3VtWYIUb-gNueWKsOURg629Vc6V0g72CK3FYgyvlbBQ8ze0IBxU3BTgtD8D7wJKo-vAfAnZ5h6sUHngDFrJT6jRVbqAUhswrVKeuo_OY1nP4OHhz8eXNhDFwPGjEnkFLrjjg0xYZ4Q6jEm0IlHWfW5F3UgMebn5MMI5VFCIsoSQNFR8LwPv46V51P17m27r8Xn1x8N6t8m2291f96-_7TbZS_a4JXRBKA0JopTQZWcMhNKsKAxau-VKOPEvGs_9u03QmtDF0LKXAp4bZwlNgMS3_ZWrfwZdaxRc9rnogQj7BQ6JVyd6F6vjeHpzDYHSNzQKZYg06bNJb88O2O1ZLX6ZHBN-LtoFFdb_NJg7LAhbXskaYesr1BfbUBcvWMKGG14Pc3tNhhe0rXRnyfuohEQIyk86pDHWjfsMO8kPxQZun3iNJzDrCsIywjInkNDFyYIuz1myVb8a20YKFzzFHoXG58KenIoSzuE8ggcZ6DMsrS7U8VLXjZD4e7AMzp1pT6RvulIBlBZPCF7ls_3rBL7JP7z_xeGls_rpfeBnEEHfCP4d2qEx2hC27ARYd6u1z113odSm5u69a2Gh3rkUxY8q6N8WHwc6z4fGJL6NQqvE0DX0mbDHgoaxdeZYEMth2wmVa_WOxom9xEBsqQv8qp9vjeo99YvTzz7MQWl-nV9spyf9AVqhf7jDs9wNhp9vezciuCrC88ybxujGCO7wIna2zZ52z5vX--enLWGriku30-qY-1V08dKoSFmRsISPMJ3EUZTQOZ3MRlU6T2Yx8mlC53zO5nNkk_1iiozO4nkyjWaTkUhpRNlkQmeTGYsmkzGdLZKcxTGP-J5G-ymZRlhzIcdSvtdjbQ4jYW2LacxYMh1Jvkdpw5il1M_QcOhDnq1GJvV3bvbtwZJpJIV19oTihJOY_s_ULDT62esgrzB_C6Ps0ujV4caoNTKtnGus7356R-jdQbiq3Y9zXRN65932XzeN0X9j7gi9C2QtoXchmP8CAAD__xu0bC8">