lli cannot execute the bc file for RISCV, Unable to find target for this triple

llvm-project version:dd8a2013dc1804be1b7d9cffacad2e984300bd22

Instructons to build LLVM+clang:

cmake -G Ninja -DCMAKE_INSTALL_PREFIX=/home/llvm/workspace/llvm/llvm-project/llvm_install -DCMAKE_BUILD_TYPE="Release" -DDEFAULT_SYSROOT="/home/llvm/workspace/riscv/riscv-tc-20200220/bin/riscv32-unknown-elf" -DGCC_INSTALL_PREFIX="/home/llvm/workspace/riscv/riscv-tc-20200220" -DLLVM_DEFAULT_TARGET_TRIPLE="riscv32-unknown-elf" -DLLVM_ENABLE_PROJECTS="clang;lld;libc" -DLLVM_TARGETS_TO_BUILD="RISCV" ../llvm

When compiling the obj file for the RTL simulation platform, everything is ok.
But when I try to run the bc file using lli, I have such an error.

#../llvm/llvm-project/llvm_install/bin/lli main.ll
../llvm/llvm-project/llvm_install/bin/lli: error: error creating EE: Unable to find target for this triple (no targets are registered)

Clang & lli version(Confusion About " riscv32-unknown-unknown-elf " WITH " riscv32-unknown-elf "):

$ ../llvm/llvm-project/llvm_install/bin/clang --version
clang version 11.0.0 ([https://github.com/llvm/llvm-project.git](https://github.com/llvm/llvm-project.git) dd8a2013dc1804be1b7d9cffacad2e984300bd22)
Target: riscv32-unknown-unknown-elf
Thread model: posix
InstalledDir: /home/llvm/workspace/test_lli/../llvm/llvm-project/llvm_install/bin

$ ../llvm/llvm-project/llvm_install/bin/lli --version
LLVM ([http://llvm.org/](http://llvm.org/)):
LLVM version 11.0.0git
Optimized build.
Default target: riscv32-unknown-elf
Host CPU: skylake

Instructons to generate main.ll:

../llvm/llvm-project/llvm_install/bin/clang --target=riscv32-unknown-elf --sysroot=/home/llvm/workspace/riscv/riscv-tc-20200220/bin/riscv32-unknown-elf --gcc-toolchain=/home/llvm/workspace/riscv/riscv-tc-20200220 -march=rv32imac -mabi=ilp32 -I/home/llvm/workspace/llvm/llvm-project/llvm_install/riscv32-unknown-elf/include -S -emit-llvm main.c

//main.c

#include <stdio.h>
int main(){
int a,b,c;
a = 5;
b = 2;
asm volatile
(
"norm %[z], %[x]\n\t"
: [z] "=r" (c)
: [x] "r" (a)
) ;
if ( c != 28 ){
printf("\nHAAWKING TEST: FAILED\n");
return -1;
}
printf("\nHAAWKING TEST: PASSED\n");
return 0;
}

Since I add some custom instructions to the RISC-V ISA and have not got a simulator, so I want to check out whether these instructions using lli.

Can anyone figure out why this happens?

LLI will either interpret the LLVM bytecode or “JIT” it to native code (basically just dynamically do a regular compilation plus code loading), so I don’t think LLI is very well suited for your use case.

In any case, I am currently working on the ELF loader used for the JIT, which AFAIK is basically the only thing remaining for LLI to work for RISC-V, if you can then execute the native instructions. So you’ll need an emulator anyway. I’m using QEMU, which you can also use for free.

Best,
Luís

Cool, thanks!

I also got this answer from https://llvm.org/docs/CommandGuide/lli.html, which says that “lli is not an emulator. It will not execute IR of different architectures and it can only interpret (or JIT-compile) for the host architecture.”
Thanks a lot. I will try QEMU or gem5.