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

    <tr>
        <th>Summary</th>
        <td>
            LLVM 18 pass DILocation getFilename cast error
        </td>
    </tr>

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

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

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

<pre>
    
llvm 18 getFileName casting error:
```
DILocation *Loc = I.getDebugLoc();
StringRef file_name = Loc->getFilename();
```

I have tried 18.1.1, 18.1.3, and 18.1.5. The error exists.

The error message is as follows:
```
clang-18: /usr/lib/llvm-18/include/llvm/Support/Casting.h:706: auto llvm::cast_if_present(Y*) [with X = llvm::DIFile; Y = llvm::Metadata]: Assertion `isa<X>(Val) && "cast_if_present<Ty>() argument of incompatible type!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: Path_to_Installs/llvm/18.1.5/install/bin/clang-18 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name hello.cpp -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=5 -debugger-tuning=gdb -fdebug-compilation-dir=/media/StoreWWD/Project/js_fuzzers/IncreFuzz/src/test -fcoverage-compilation-dir=/media/StoreWWD/Project/js_fuzzers/IncreFuzz/src/test -resource-dir Path_to_Installs/llvm/18.1.5/install/lib/clang/18 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem Path_to_Installs/llvm/18.1.5/install/lib/clang/18/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -vectorize-loops -vectorize-slp -fpass-plugin=../install/lib/libIncreInstr.so -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/hello-d7827c.o -x c++ hello.cpp
1.      <eof> parser at end of file
2. Optimizer
```

Source files to reproduce the bug:

Mini.cpp
```
#include "llvm/IR/Function.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Pass.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"

#include <llvm/IR/DebugInfo.h>

#include <iostream>

using std::string;

using namespace llvm;

static cl::opt<bool> Wave("wave-goodbye", cl::init(false),
 cl::desc("wave good bye"));

namespace IncreFuzz {

struct Bye : PassInfoMixin<Bye> {

  bool runBye(Module &M);

 PreservedAnalyses run(Module &M, ModuleAnalysisManager &) {
    if (!runBye(M))
      return PreservedAnalyses::all();
    return PreservedAnalyses::none();
  }

};

bool Bye::runBye(Module &M) {
  errs() << "Run Module!\n";

  if (Wave) {
    errs() << "Bye Module: ";
    errs().write_escaped(M.getName()) << '\n';
 }

  for (auto &F : M) {

    for (auto &BB : F) {

 for (auto &I: BB) {

        DILocation *Loc = I.getDebugLoc();

 if (Loc != nullptr) {
          StringRef file_name = Loc->getFilename();
          StringRef file_dir = Loc->getDirectory();
          unsigned int line = Loc->getLine();
 errs() << "file: " << file_name << ", line: " << line << "\n";

          if (line == commit_line_num && file_name.str() == commit_file_name) {
            commit_bb = I.getParent();
 outs() << "Find the commit basic block.\n";
          }
 }
      }
    }
  }

  return false;
}

} // namespace

/* New PM Registration */
llvm::PassPluginLibraryInfo getByePluginInfo() {
  return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING,
          [](PassBuilder &PB) {
             
 PB.registerOptimizerLastEPCallback(
                /// This extension point allows adding optimizations before the function optimization pipeline.
                [](llvm::ModulePassManager &PM, OptimizationLevel Level) {
 PM.addPass(IncreFuzz::Bye());
                });
                
 PB.registerPipelineParsingCallback(
                /// Using these callbacks, callers can parse both a single pass name, 
 /// as well as entire sub-pipelines, and populate the PassManager instance accordingly. 
                [](StringRef Name, llvm::ModulePassManager &PM,
                   ArrayRef<llvm::PassBuilder::PipelineElement>) {
                  if (Name == "goodbye") {
 PM.addPass(IncreFuzz::Bye());
                    return true;
 }
                  return false;
                });
 }};
}

#ifndef LLVM_BYE_LINK_INTO_TOOLS
extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
  return getByePluginInfo();
}
#endif
```

CMakeLists.txt
```
cmake_minimum_required(VERSION 3.19)

project(IncreFuzz C CXX)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 20)

set(CMAKE_BUILD_TYPE Debug)

set(CMAKE_PREFIX_PATH "path_to_your_llvm_install")
find_package(LLVM 18 REQUIRED CONFIG)

separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
add_definitions(${LLVM_DEFINITIONS_LIST})
include_directories(${LLVM_INCLUDE_DIRS})

set(CMAKE_CXX_FLAGS "-Wall -fno-rtti")

add_library(Mini
    MODULE
 Mini.cpp)
```

Exec command:
```
#!/bin/bash

cxx="path_to_your_clang++"

pass="path_to_your_pass.so"

${cxx} -g -fpass-plugin=${pass} hello.cpp
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8WVlz47iP_zTMC4ouW3Kuhzz47L9rHMebpI95UlESJHMikVqSytGffguUbPlI0j2zO-tKq20KAMEfQVwU1spcId6w8zE7n56J2m20uREqrgf9YHgW6_TthvWnrD8qiucSBleQo5vLAleiREiEdVLlgMZow8JRQ8ku-u2f_zldLHUinNQKWDBa6gRYOIVFL0c3xbjOlzphwRULrlk4bjgenJEqv8cMMllgpGgq4lnqhLNw1mpAw0eMRzM3zwVsxDOCMxJTGFz1Br0BCybNt5C-CdWOn_fgcYPNagBfpXW2ty-pe1mitSJHkBaEhUwXhX6xHwGQFELlfHDFwhGwYF5bw4J5IWN6Fs8lvQnmUiVFnWI7xoL5Q11V2jgWzCcNyr0NC0eX_QsSI2qnwROGIxaOaB8imUWVQYvKseDqTxaMWHAN7Hz8It0GfngAO47pgiBk4Rj-PHpzi06kwgl2PqWZRtaiaTbvoi-tYOHkBwtnLLj6Jgo_Q3DBggtgQXCsRTh5fGtIiU6YvC5ROdAZSJXoshJOxgWCe6uQBQMWBCy4hEzIAtMW9vVyNnqYga3jUjoQENc5GCRYwGnYOFd50IM5C-a5dJs67iW67DD08FZG_4UJASmtrdGyYO63vEUc3AYhMcJuIBbJkzMiQbKKymBldILWYgpW16YZJk5hrU6kcJiCqRXYxMjK9ba2K5InSOuy2plDvwdro3Mjyh0IpDashdtETkcLZZ0oCtvp3Vijtwr_igXzWCoWzLemBDxJBsCdkVWB8Hp1EV0Mea2elH5RvJCqfuW5qoFjKR3X8V_ASaNUGhAceCqtiAvkmUEEnhQoDBfW8RgzbZATDKjSjs7D-IxGZhKNH06ESfmzKGrkdAwt8FJIxem4-gHYYFHoXlJVwEuDResAeKlTLKCSCfBKJrzAZywgAJ5tRJFxpbnFUignEy6VQ1NpK73t8TIzokReaT_OwqnSCoFnpXAbjsYoDTzLKp5oRTvoWDgltkxpbnStUqlyTrTAy0Qr60ydOG24KKSwpH5WqxepUu5owZaF0wC4EyZHx5OqJoT5xRC4qxX6gRwVGlpGSi6MS5Vp_iRVysLpnnzg6YswGWFnpVYsnJ63HDkaEiZVzsJpnsbAs0YSHQxZNGilklbKgnmJqRTkE5w2-P07Da13Vv2XjbL65080ZEALlRic1z9_smBuTcKCuUPrgGeJfkYjcvy3JjDYnBGS-fcsu_GE3rI9ATR7r0TBpX2zDstjr5knNG9r9TtrJ-Y-C-a93umj864JC8b-bz7o_7szvcP1_zf5_kzkPUTy9CJM-s6k_6u96ub8dDk6oVjxW6T_cOXv0J7Ohq_0JTmd9eNN-5z7708B_C70Z70ymFAE4aVIDDkvn1jwQlKkG1wDz3JVJ3ueY9gLegPgmX2SFdep4ckGkycuFc_LjA746yvH1wQrOtnk0Q5-JLrQhqdS5EpbJxML_BnJRcmfyAutq4MBW1TAs0pYy6uiziXN3xrYoSUUMvYOgYzH9CytQ6SpsTIHPo2iL5NJ9J_Rt1k0_T66nwfRZL6IRg-3LJwOgGsCx5UVC-Y-WvD08iq4THoa-Cu09tvFkSaUDnrgPyycoM5YOINKGIsGhAMKWbpJGRvioAd3lZOl_Inmk_zwwfstz2cprfBxP62TJjOI67zL6_zzVirZaXQsMgi3O82CoD1Ii3sWzOe1Smg3ehvKdH5BvMRcJG9rYe2tUCJH8ysuIv0dGp_-0JdxLYv09-TueNbeFn7Fspe46rIUKl1Khb_PZMRLpK0zKMp9phPWcLIPmK8kFirTlCXPPuaRregjotpSGWNd2uTA1hcgXVmxR-PTnUok2KbMByTWCScTSIpGjK4oCY61LshSv4vnpl4JXsQz8lzrNH5Dn_ZOdixSSUrfM1FYpMommDSSdwQp2qSTAiQFtmKuD2oh_-zU3QVuYJdHSlOyAuM3AoiyUmsJyFv5Sud-Mn5D0v6ICYCWRekvvQ-ubnVaF7ShF7enSsCaKgLzjOlIieKNEi5Tq2OuCTQ_Gxq5tfymwLjuFKDzLzPwIAw6Bdrl70gADLraqNPJGyC9GzuoHn_NQ0nnCRO7nB7Y2-X0aPkeKQ8jyfgAsv31oaFUy1dNLJywcEIH5b5WLUBULJ1PFG35Ec4tLo2lHUH2rlDa9FaoL06DAzA6lt6LkQ4jtImoMCXlqXxfdRX4vtTLRrvLTtYRRACZpn298mUsCy7m3vIOYejUOCIejz31_D3qI9IFEY7HH8ilz99vTrT8DdKeIRgQj6qLonLmBPfm849bGh-KoDz7UMJUGh_B3z4UUSvf7qHa10Eh1bEO5KmPmd-1Gx9kG4vZju6va0tGh5qmOSJtZ95RfWDM208D9VZd0jjRZSldREORqsttD2KnQs_SRrQ673PsKD7YJtgSxnFnCGthmqbKAS66dqe4zKVKm4aCFwOxsDKBuNDJU-94md2cu-Ox9-3oxeGPk_PUuq0mbOxwPHFM0LRKuiB2GCjnLBjBCl9gfQv3mEvrzO5o0NtdH7DxZF1KsJSxEeaNwgbk6MZv2IzTwBajDuxWWXY5Xi6_3Ubr5dcvi1U0Wi-ib7P7h8XdisymcU6tDXm69mX08Hi_WH3pImMHo-9hsuBqL78h01iPP9xt2Aaocc_4BaPZpYxLYd1sPRFFQdUTLeOUnSR4SAnVx420QAWAopQdfK8ChG8NgkhTyh50I1w0aXnTb_H2krXZ4QEFVLJCMvLeB1NvF7zXvfPOfC9x9AD46Hq3J3npGy_-eYjN-rYn0pT4WXDV1fpedhO2jtKME50up5--PsF73a5xLQwlWH8D768-IXMbtAhJy2Z9MiWKAo2FRKimPoBYuw0IIIYCgQobaLzAZKtRJ1ZYeMGioP9ROWkQbB3z7VbYbROw0lVdCNds3z7gvkZSCYJIEm1o24u3HvxiBzvnvmr1-p09fV8oAIyMEW_3mG2z5N15bY9FO9CuaVZg6Ru2s48Piv80nnjVBi9ykCwI9hPZ_1NTgi4fc6bGd9KJD-kPHeGvbJR-72dtR34zCGWmUswaNzT-cxYtF6s_osXq8S56vLtbPjR0TelPiEwo1nni0ePj_WL89XEWfZ-N_oBm8b_woJ2b_UKxZ0vxqS993-m-s6IgRJXK7JNyeHIrnnDp7z7cq3v_QqMUTxiVUsmyLiOD_11L47PC1kVD2Bt0yXjz3HXhO1OACUx-_Diis0g0k9vRH7NoEj08jlbT0f0Urjt5BxQ_fnQ0Qf8TWeOvi-U0evxzPQOf2H1Cur6fzRc_ovXo8T-0m1XbIHvTtYloW6JdFyTYScmkSqNKJE8iJ8umzYfBFdzP_uvr4n42hcndar74cjJpJYxwGHXXAg1rNJ3NF6vF4-Ju9RAtFw-PsBo9Lr7Nosnd7e1oRcduuA2fe6StXXvZIk2jFDOqJynWeIN4j8eL32dsi2XKL5t-EB4xL1aT5dfpLJou7g9mfH935svRlweCkX8XRdF25J2T--B1GhfNMaACQyrZnd7bu-nXZVuxw64Bs-N_z45nr5j4NEyo9KObORaE_uapvV2Jhd3si0heX317_NAE2u5n0149aE9QXHmHgYZ7Vp_0MghRmuJyCjw_6bc1773Iy-lxH-xoHWfpTZheh9fiDG8Gl4Ph5fXVdX94trm5Pk-vs2txnZwPBsP4Kr0W6YXopxdxnAyvszA-kzdBPxj2z_v0bzAc9gbxBQ6HwxT7gwwvYmTDPpZCFj2y_J42-Zm_Rbu5HvSHw7NCxFhYf3scBApfwL_0Of30zNz4i6O4zi0b9gvvUnZSnHQF3mzPiY_Ie7XYXj3kL5mba9ez2hQ3__zWz6v8PwEAAP__0AUncg">