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

    <tr>
        <th>Summary</th>
        <td>
            Where and When does the outer customized pass plugin execute exactly?
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          TJU-PanYizhe
      </td>
    </tr>
</table>

<pre>
    I used `PassInfoMixin` to implement my own pass plugin and load it with `clang-19 -fpass-plugin="build/libRCXLP.so" tests/test.c -S -emit-llvm -o tests/out/test_clang.ll` command.

I wonder Where and When does this pass plugin execute exactly?

- before all other passes implemented in llvm
- or after all other passes
- or ... ?

This is my pass plugin code

```C++
#include "RCXLP.h"

using namespace std;
using namespace llvm;

namespace
{
  class MY_TEST_Pass : public PassInfoMixin<MY_TEST_Pass>
  {
  public:
 vector<RCXLP::RIRInstruction> rir_instructions;

    PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM)
    {
      cout << "My first pass plugin" << endl;
      return PreservedAnalyses::all();
    }
 };
}

llvm::PassPluginLibraryInfo getMyPluginInfo()
{
  return {
 LLVM_PLUGIN_API_VERSION, "MY_TEST_Pass", "v0.1",
 [](llvm::PassBuilder &PB)
      {
 PB.registerPipelineStartEPCallback(
            [](ModulePassManager &MPM, OptimizationLevel Level)
            {
              FunctionPassManager FPM;
              MPM.addPass(MY_TEST_Pass());
            });
 PB.registerPipelineParsingCallback(
            [](
 llvm::StringRef Name, llvm::ModulePassManager &MPM,
 llvm::ArrayRef<llvm::PassBuilder::PipelineElement>)
            {
 if (Name == "my-test")
              {
 MPM.addPass(MY_TEST_Pass());
                return true;
              }
 return false;
            });
      }};
}

extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo()
{
  return getMyPluginInfo();
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVkuT2jgQ_jXi0oXLIzM8DhwMAyl2h8TFkGRzomSrAe3KEiXJM0N-_Vbb5rVhk611uTDqlz593S1JeK92BnHMHifs8akjqrC3brz-7XM3E-ab-r7HTm7lcbyAyqME1o8z4f3CbO1SvSvD-jEEC6o8aCzRBCiPYN8MHIT3cNDVThkQRoK2QoIK8KbCnoIUWphd92EE3S2ZdhtTljwxzvNKacn4XKt8Nf3jOYu8ZZxDQB8843P6RgV0X6CLpQpdrV9L6Nqz3lahtdrUs0RaE8rClqUwMmJxyuJ0AW_WSHTwdY8Oa4hf92hAWvQQ9srfrADfsagCAr6LIugjS-ZNlC7kuLXkrzXYsEdXu6G_EIISlAHCWNtbB2Ib0P3gcdJGUQTn-GsCojyReg2nsBIbA9aPm3fK-ITeOGU8UabQlURgnDcE7hnnjUPlldmBESX6gygQfJAsmdxR1IhrDYvTs5iGAxICFJoQLb9t1rOX9YaKAliSwqHKtSrgtkiS6bUdS2Z1hFOkxoUlNBO8YhGsY8m0Rk7CJF0tVgvjg6uKoKxhyQyccht1EfkzUgCAzKFH94oyNUIfKRuuMowPl1ZWmljpLxmfQjNsbJRfCiN26GptumR81AY7gaSnsFUAlkxZMiVul0fYKufDdW6oUFsLNFI3uBpvh6Fy5kd0zRqF1owPad6zCxs80T_6NMurxyxOm9yQF9GZ1RM_q9wJdyTOYYdheWzENG7jXlLXImmHz89flpvs-fOHxcdNmi02X2arl8Wnj0QRLfI6cZy30tc4emhGNcJ672B8eAtsQn3cUJpNLoyeOc0mkcOd8gFdpg6olcGXIFyYZVOhdS6Kvwj5yal1PU3VZI-muc5cVmf20yGoUn0XVBrP-Ioa6t9rCDdAbp55Zeqaug49z5bXmTw9y2wZCSkbaoa3TNWUX2fzMufTRX6Hgkw4asX_QAHJL4y_BKfMboVb-ChKJBouup-QdRskdU4cV7hlyfRuLltBC3XWbHHUz_9GrdoC40NCBLS5J09UPeWxS9tzXUD_9Dt7_i9yr_osuArvGbRd1VpthfZ3zG6SdJb80Ij4HpAaifMpNX7dSel6vVpMPq9nm6-z9HdoGPtFx7Y9_QHDRf2zzr3f4NfYTudCR44TOUpGooPjh8Fj3Isfk96wsx8L8cCTfjEa4IhvB4NcDAoc9IYPuZQS5SDpqDGP-WPc53E86HE-jOTjViaD4bCfi6QX45D1YiyF0hFBj6zbdZT3FY4fer3RiHe0yFH7-l7BucE3qLWU88enjhuTUzevdp71Yq188JcwQQWN4_sHM4Kt6PgsKh9sqb6j_MVB3amcHu9DONT7LJ8zPt-psK_yqLAlXTIoM82ne3D2Tyzo9lBjpctEu5jXMf87AAD__5fIvVQ">