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

    <tr>
        <th>Summary</th>
        <td>
            How can I JIT a multiple function IR file with ORC JIT?
        </td>
    </tr>

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

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

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

<pre>
    I'm trying to use ORC JIT to compile a .ll file, but I'm encountering some issues. 
When I attempted to compile a .ll file containing multiple functions using ORC JIT, the following error occurred.
```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: ./JIT_testSymbol_NoOtherFunc
 #0 0x0000ffff8a3513bc llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/jinrui/llvm-project-main/llvm/lib/Support/Unix/Signals.inc:723:11
 #1 0x0000ffff8a3518c4 PrintStackTraceSignalHandler(void*) /home/jinrui/llvm-project-main/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x0000ffff8a34fa58 llvm::sys::RunSignalHandlers() /home/jinrui/llvm-project-main/llvm/lib/Support/Signals.cpp:105:5
 #3 0x0000ffff8a35211c SignalHandler(int) /home/jinrui/llvm-project-main/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x0000ffff9453578c (linux-vdso.so.1+0x78c)
 #5 0x0000ffff89f15bec std::ostream::sentry::sentry(std::ostream&) (/lib/aarch64-linux-gnu/libstdc++.so.6+0x128bec)
 #6 0x0000ffff89f16438 std::basic_ostream<char, std::char_traits<char>>& std::__ostream_insert<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*, long) (/lib/aarch64-linux-gnu/libstdc++.so.6+0x129438)
 #7 0x0000ffff89f16930 std::basic_ostream<char, std::char_traits<char>>& std::operator<<<std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*) (/lib/aarch64-linux-gnu/libstdc++.so.6+0x129930)
 #8 0x0000ffff89fe40d0
 #9 0x0000aaaad3925b70 main /home/jinrui/llvm-project-main/llvm/examples/OrcV2Examples/JIT_testSymbol.cpp:41:7
#10 0x0000ffff89bc9e10 __libc_start_main /build/glibc-RIFKjK/glibc-2.31/csu/../csu/libc-start.c:342:3
#11 0x0000aaaad3925848 _start (./JIT_testSymbol_NoOtherFunc+0x5848)
Segmentation fault (core dumped)
```
Why does this happen? I tried a similar approach successful when compiling a simple 'helloworld' program, but when I switched to a program with multiple functions, errors occurred. Could this be related to _symbols_ or does JIT require a special method to handle Modules with multiple functions? I'm currently having trouble understanding this.
Here is my main JIT program code.
```CPP
#include "llvm/ADT/StringMap.h"
#include "llvm/ExecutionEngine/Orc/DebugUtils.h"
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"

#include "ExampleModules.h"

using namespace llvm;
using namespace llvm::orc;

ExitOnError ExitOnErr;

int main(int argc, char *argv[]) {
  // Initialize LLVM.
  InitLLVM X(argc, argv);

 InitializeNativeTarget();
  InitializeNativeTargetAsmPrinter();

 cl::ParseCommandLineOptions(argc, argv, "LLJITDumpObjects_RepeatLookup");
 ExitOnErr.setBanner(std::string(argv[0]) + ": ");

  auto J = ExitOnErr(LLJITBuilder().create());

  auto M1 = ExitOnErr(parseExampleModuleFromFile("/home/jinrui/llvm-project-main/sjr-test/testMutilFunction.ll"));

 ExitOnErr(J->addIRModule(std::move(M1)));
 
  // Look up the main function
  auto MainAddr = ExitOnErr(J->lookup("main"));
  int (*runmain)() = MainAddr.toPtr<int()>();

  int result = runmain();
 outs() << "exit " << result << "\n";
  return 0;
}
```
Here is my original CPP code, which I compiled into an .ll file using the command 'clang -S -emit-llvm helloWorld.c -o helloWorld.ll'.
```cpp
#include <iostream>

// function 1: add a and b
int add(int a, int b) {
 return a + b;
}

// function 2:multiply a and b
int multiply(int a, int b) {
    return a * b;
}

// function 3: printf a string
void printMessage(const std::string& message) {
    std::cout << "Message: " << message << std::endl;
}

int main() {
    int x = 5, y = 3;

    // call function 1
    int sum = add(x, y);
 std::cout << "Sum: " << sum << std::endl;

    // call function 2
 int product = multiply(x, y);
    std::cout << "Product: " << product << std::endl;

    // call function 3
    std::string message = "Hello, functions!";
    printMessage(message);

    return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWNly27gS_Rr4pcsqEtRCPfhBlq2KM_bYZXsm900FgpCIhAR4sXi5X3-rAVJ7lklmalKqmCSAxunDRvdpMmvlWglxQUaXZHR1xryrtLl4rowxQghxVujy_eKG0EkDzrxLtQanwVsB949z-HjzjLdcN62sBTAY1DWsZC0InUPhHcSFQnHtlRMGl1vdCJDWemEHQJIrksw-VULBDTDnRNM6UZ62CVwrx6RCI42vnWxrASuvuJNaWfAWBzpUuL-rBKx0XetXHBDGaAOac2-MKAdxYzJOul-4fbi9nj1dg_VFIx0wKPwajGi1cYiocq61JJsRuiB0sZau8sWA64bQRV2_9H_OW6M_C-4IXUQnCV0AUyVIxWtfigCLG2YrKBj_4gzjokPz5Bj_AqVvWtwlPEoGEP49GL02rAFm1r4RyiEOGBC6-HjzvHTCuqf3ptD18nd97yphFl7xaAAIzRJI3pIkSVar1Spn2SjNCg4BcjYj2cy-23jxYKRyAcQzoiI0304y7HWprTOCNYSOkV6pHKFTIHRR6UYQuvgslfHygIbzhkm1w5AsCF08-RZJJXTxh5Jv-ECuFavtQCpOstmEZiSbpenWg_TQg5wP4QButPGBqbIWhtD8RcuS0Nk_hXGaI8YtRLoPcbhio_wUyY9e7SG1hOa_jrEHx1uMnTQZkWw22oLLDvijacrhkLB_7oUO02yfrOEOnulwlI0mOQeMN6n82_lLafXA6kFK6GXyNsk5odPt2tGuL9NVOioEB-vKSG8fo5F0oZx537um-dFUDGd0O9-4w5jh1Xh4HuGslY8j1pWc0EtCLxHdOKBLaV6IfYDjA4DjYZZvARbMSr45StmcV8zgcdpMwAdLZ5jEQx6Hs2v80fF20rK3sJTKCuP-mqH8b0GD8_AB5mXrwlGbQ63V-pfonA6zfI_OySGd0yz5u-nUrTDMaUOyefz9myT-CnnTLNkjL98nTwyTMtmOTrtRxhgrsykdFZME8Hz_xSQg3ljT1qHU3Rv-J73e3u_Xpy4_DVPMoF0Jplm6V6CmBZ-KNIHlspYFX1rHjFv2oAov6xKrL46dP94sfvv82-aWDrKU0AW3yNFgsLkMg8HOALNRNqT4_3b79JCGfJhD3BhfxXfKLDKPKza8P4k1lmiGsgRWzNfBCtdGhNouys3MA_nxqXqHUgsLrpIWKta2QpFsATfgjBQlMLCykTUzwNrWaMYrsJ5zYe3K1_CKIiqqJtQ7YTIqJEInlUAVpA1SN4E2aoleor1G8WVfpeNV1F6snwOv0lUnxBauDYLKbhUVzLWvy4i9EGBEzTopt7SBNbsEbaKDqBuN-K-XBgWebQWXrIZGuEqHFVUoSnCnS18L-1UUyE0QmAGCcvU7VOwlaFSjfVEL8KoUxjqmyvC0krbTWh-EQRUKzXsMeETUO811KQ4F4vzhYRMwvZIjlHYHYHb1jEXPocC9Y-2gIpR-Y_r1m-AeXbhWa6lEPDaELq5E4dd_OFnbn7Vwe_vx5vlnF98XeLafDVN2pU1zy96F-Z6tbeW_UdLd3v559-MrnplZC_ckasHdj6_aUaK7i04s7dJQF0VHk2PDoFgjbMu46MTa5bcGQ60wfDMr_n_9Jt29ug4Nxub6YI5UDmLSRJ2FOp5vUj-hM2bWL7EDC_l_0q0FiM0GILmS1fJ_AgLH_XBPOvyH0Lw3GozR6QGCHRu_MydfRKQ_ys_NXPjKtJltgt4OSvGEcV53PQQzVsx10zBV3kol7tsuYRygm-MLCtF65Zs2Rp5dPopWMHer9Rff4tvaBbZhdmCFu2RKBSibGmvD4Yv7IJVJzyW9xK2wXzqw2DvMvNPwEUh2tfP2aB7AXWK96X0ecCOYEx0BX7N0lx6ZapGUvWhcGN0sQp-cB1Q_VG3tZ3OORYjQBf65807Wiy4ZDuq6c-8Y1y6Uj-cku2ZlefMYgexS2OgXvL9LOzO77B_EI74i8G1oZkP-7JPyPhVMqllZmiNCAoq6e83IQPTwED9gkxnV0Mx4FSdN-4Ypu9psMHD6waF6Cz1MjM_r04EaTBphQ1nOrmBjd_8YaO82nVlQhBg94k0iHNo_2pjpJ5DRPLixdcAI542CZAtjcnWy-O8UJG3kWipWw_zhIRQjPC6vleQV3PTfRUr0QwNT288jMWWFzwvx_GHp5zVTazh_gnPRSHeOYQVBDnxCOTDgcK537zGKJoe1D0XbUXrN5nKjeK_3c3CIkD4gALUesBLlC2IqtvmQlWWfDrsPClDsp7-OPRZOcXGCw5M74mHv1ML78a79yHe2Btjdffbju2OrCy3myhVqm5iWwswXLcs4ciesZWsRZKGyDo6y2BiafsoBqG1Tof1u6PUmY57rBzor_e1msVBl_TWHdkrV0e449hbOzQh5ew-X2dEZ2-QJzjA6t6GwZ8j6JqyPcfAWDO4dwq_5-uSbAz-jqW_5-G1knTAIsFqjS89jdtgJlhP4vvE6HqKRA5hb0z8PNTuxeQybnbd9hbt-wHONqHd0e7qfnuAwHrdhdwLPDySzs_IiK6fZlJ2Ji3SSpMk0H6bDs-piWg6HY1oklInxaLUaZgmdUp6LPC2zYjxOzuQFTbAZo5N0RJM0HQynk-EkL1fFtEzyYjohw0Q0TNYDTGIDbdZn4QPrxSQb0clZzQpR2_AZm1IlXuMn5pCTr87MRainhV9bMkxqaZ3dWnHS1eLig34FzrATwlaAHbcbcPMY82zoRvrvzNnizJv64ue_DQf0_w8AAP__gPsajg">