Cross-compile in docker:
host> docker run -v $(pwd)/Develop/llvm-project:/root -it echtzeit/ubuntu-cross-aarch32-clang-repl:20.04-gcc10 /bin/bash
$ cd /root
$ cmake -S llvm -G Ninja -B build-ubuntu20.04-host -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;llvm"
$ ninja -C build-ubuntu20.04-host llvm-tblgen clang-tblgen
$ cmake -S llvm -G Ninja -B build-ubuntu20.04-aarch32 -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS="clang;llvm" \
-DCMAKE_CROSSCOMPILING=1 \
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc-10 \
-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++-10 \
-DLLVM_HOST_TRIPLE=arm-unknown-linux-gnueabihf \
-DLLVM_TABLEGEN=/root/build-ubuntu20.04-host/bin/llvm-tblgen \
-DCLANG_TABLEGEN=/root/build-ubuntu20.04-host/bin/clang-tblgen
$ cd build-ubuntu20.04-aarch32
$ ninja clang-repl
...
/usr/lib/gcc-cross/arm-linux-gnueabihf/10/../../../../arm-linux-gnueabihf/bin/ld.gold: error: PLT offset too large, try linking with --long-plt
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
$ ninja -t commands clang-repl | tail -1
...
$ /usr/bin/arm-linux-gnueabihf-g++-10 -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -fno-lifetime-dse -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-uninitialized -Wno-nonnull -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wsuggest-override -Wno-comment -Wno-misleading-indentation -fdiagnostics-color -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -fuse-ld=gold -Wl,--export-dynamic -Wl,-rpath-link,/root/build-ubuntu20.04-aarch32/./lib tools/clang/tools/clang-repl/CMakeFiles/clang-repl.dir/ClangRepl.cpp.o -o bin/clang-repl -Wl,-rpath,"\$ORIGIN/../lib:" lib/libLLVMAArch64CodeGen.a lib/libLLVMAArch64AsmParser.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64Disassembler.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Utils.a lib/libLLVMAMDGPUCodeGen.a lib/libLLVMAMDGPUAsmParser.a lib/libLLVMAMDGPUDesc.a lib/libLLVMAMDGPUDisassembler.a lib/libLLVMAMDGPUInfo.a lib/libLLVMAMDGPUUtils.a lib/libLLVMARMCodeGen.a lib/libLLVMARMAsmParser.a lib/libLLVMARMDesc.a lib/libLLVMARMDisassembler.a lib/libLLVMARMInfo.a lib/libLLVMARMUtils.a lib/libLLVMAVRCodeGen.a lib/libLLVMAVRAsmParser.a lib/libLLVMAVRDesc.a lib/libLLVMAVRDisassembler.a lib/libLLVMAVRInfo.a lib/libLLVMBPFCodeGen.a lib/libLLVMBPFAsmParser.a lib/libLLVMBPFDesc.a lib/libLLVMBPFDisassembler.a lib/libLLVMBPFInfo.a lib/libLLVMHexagonCodeGen.a lib/libLLVMHexagonAsmParser.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonDisassembler.a lib/libLLVMHexagonInfo.a lib/libLLVMLanaiCodeGen.a lib/libLLVMLanaiAsmParser.a lib/libLLVMLanaiDesc.a lib/libLLVMLanaiDisassembler.a lib/libLLVMLanaiInfo.a lib/libLLVMLoongArchCodeGen.a lib/libLLVMLoongArchAsmParser.a lib/libLLVMLoongArchDesc.a lib/libLLVMLoongArchDisassembler.a lib/libLLVMLoongArchInfo.a lib/libLLVMMipsCodeGen.a lib/libLLVMMipsAsmParser.a lib/libLLVMMipsDesc.a lib/libLLVMMipsDisassembler.a lib/libLLVMMipsInfo.a lib/libLLVMMSP430CodeGen.a lib/libLLVMMSP430AsmParser.a lib/libLLVMMSP430Desc.a lib/libLLVMMSP430Disassembler.a lib/libLLVMMSP430Info.a lib/libLLVMNVPTXCodeGen.a lib/libLLVMNVPTXDesc.a lib/libLLVMNVPTXInfo.a lib/libLLVMPowerPCCodeGen.a lib/libLLVMPowerPCAsmParser.a lib/libLLVMPowerPCDesc.a lib/libLLVMPowerPCDisassembler.a lib/libLLVMPowerPCInfo.a lib/libLLVMRISCVCodeGen.a lib/libLLVMRISCVAsmParser.a lib/libLLVMRISCVDesc.a lib/libLLVMRISCVDisassembler.a lib/libLLVMRISCVInfo.a lib/libLLVMSparcCodeGen.a lib/libLLVMSparcAsmParser.a lib/libLLVMSparcDesc.a lib/libLLVMSparcDisassembler.a lib/libLLVMSparcInfo.a lib/libLLVMSystemZCodeGen.a lib/libLLVMSystemZAsmParser.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZDisassembler.a lib/libLLVMSystemZInfo.a lib/libLLVMVECodeGen.a lib/libLLVMVEAsmParser.a lib/libLLVMVEDesc.a lib/libLLVMVEDisassembler.a lib/libLLVMVEInfo.a lib/libLLVMWebAssemblyCodeGen.a lib/libLLVMWebAssemblyAsmParser.a lib/libLLVMWebAssemblyDesc.a lib/libLLVMWebAssemblyDisassembler.a lib/libLLVMWebAssemblyInfo.a lib/libLLVMWebAssemblyUtils.a lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Disassembler.a lib/libLLVMX86Info.a lib/libLLVMXCoreCodeGen.a lib/libLLVMXCoreDesc.a lib/libLLVMXCoreDisassembler.a lib/libLLVMXCoreInfo.a lib/libLLVMCore.a lib/libLLVMLineEditor.a lib/libLLVMOption.a lib/libLLVMOrcJIT.a lib/libLLVMSupport.a -lpthread lib/libclangAST.a lib/libclangBasic.a lib/libclangFrontend.a lib/libclangInterpreter.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Utils.a lib/libLLVMMIRParser.a lib/libLLVMAMDGPUDesc.a lib/libLLVMAMDGPUInfo.a lib/libLLVMAMDGPUUtils.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMLanaiDesc.a lib/libLLVMLanaiInfo.a lib/libLLVMLoongArchDesc.a lib/libLLVMLoongArchInfo.a lib/libLLVMRISCVDesc.a lib/libLLVMRISCVInfo.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZInfo.a lib/libLLVMWebAssemblyDesc.a lib/libLLVMWebAssemblyInfo.a lib/libLLVMARMCodeGen.a lib/libLLVMAsmPrinter.a lib/libLLVMGlobalISel.a lib/libLLVMSelectionDAG.a lib/libLLVMARMAsmParser.a lib/libLLVMARMDisassembler.a lib/libLLVMARMDesc.a lib/libLLVMMCDisassembler.a lib/libLLVMARMInfo.a lib/libLLVMARMUtils.a lib/libclangFrontendTool.a lib/libclangCodeGen.a lib/libLLVMCoverage.a lib/libLLVMFrontendDriver.a lib/libLLVMLTO.a lib/libLLVMExtensions.a lib/libclangExtractAPI.a lib/libclangRewriteFrontend.a lib/libclangARCMigrate.a lib/libclangStaticAnalyzerFrontend.a lib/libclangStaticAnalyzerCheckers.a lib/libclangStaticAnalyzerCore.a lib/libclangCrossTU.a lib/libclangIndex.a lib/libclangFrontend.a lib/libclangDriver.a lib/libclangParse.a lib/libclangSerialization.a lib/libclangSema.a lib/libclangAPINotes.a lib/libclangEdit.a lib/libclangAnalysis.a lib/libclangASTMatchers.a lib/libclangAST.a lib/libclangSupport.a lib/libLLVMFrontendHLSL.a lib/libclangFormat.a lib/libclangToolingInclusions.a lib/libclangToolingCore.a lib/libclangRewrite.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMOrcDebugging.a lib/libLLVMOrcJIT.a lib/libLLVMPasses.a lib/libLLVMCFGuard.a lib/libLLVMCodeGen.a lib/libLLVMCodeGenTypes.a lib/libLLVMHipStdPar.a lib/libLLVMObjCARCOpts.a lib/libLLVMCoroutines.a lib/libLLVMipo.a lib/libLLVMVectorize.a lib/libLLVMInstrumentation.a lib/libLLVMFrontendOpenMP.a lib/libLLVMScalarOpts.a lib/libLLVMFrontendOffloading.a lib/libLLVMAggressiveInstCombine.a lib/libLLVMInstCombine.a lib/libLLVMLinker.a lib/libLLVMTransformUtils.a lib/libLLVMIRPrinter.a lib/libLLVMBitWriter.a lib/libLLVMExecutionEngine.a lib/libLLVMTarget.a lib/libLLVMAnalysis.a lib/libLLVMProfileData.a lib/libLLVMSymbolize.a lib/libLLVMDebugInfoPDB.a lib/libLLVMDebugInfoMSF.a lib/libLLVMDebugInfoBTF.a lib/libLLVMWindowsDriver.a lib/libLLVMRuntimeDyld.a lib/libLLVMJITLink.a lib/libLLVMOption.a lib/libLLVMOrcTargetProcess.a lib/libLLVMOrcShared.a lib/libLLVMDebugInfoDWARF.a lib/libLLVMObject.a lib/libLLVMMCParser.a lib/libLLVMMC.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMCore.a lib/libLLVMRemarks.a lib/libLLVMBitstreamReader.a lib/libLLVMTextAPI.a lib/libLLVMBinaryFormat.a lib/libLLVMTargetParser.a lib/libLLVMSupport.a lib/libLLVMDemangle.a -lrt -ldl -lpthread -lm -Wl,--long-plt
$ ls -lh bin/clang-repl
-rwxr-xr-x 1 root root 3.7G Jan 9 14:56 bin/clang-repl
Get device IP and start lldb-server:
ez@raspberrypi:~/Develop/clang-repl/bin-prebuilt $ ip address | grep 192.168
inet 192.168.1.104/24 brd 192.168.1.255 scope global noprefixroute eth0
ez@raspberrypi:~/Develop/clang-repl/bin-prebuilt $ ./lldb-server platform --server --listen 0.0.0.0:9001 --gdbserver-port 9002
Connection established.
Transfer the binary:
host> scp ~/Develop/llvm-project/build-ubuntu20.04-aarch32/bin/clang-repl [email protected]:/home/ez/Develop/clang-repl/bin-prebuilt/clang-repl
Remote debug with local source files:
host> lldb-17
(lldb) platform select remote-linux
Platform: remote-linux
Connected: no
(lldb) platform connect connect://192.168.1.104:9001
Platform: remote-linux
Triple: arm-unknown-linux-gnueabihf
OS Version: 6.1.21 (6.1.21-v8+)
Hostname: raspberrypi
Connected: yes
WorkingDir: /home/ez/Develop/clang-repl/bin-prebuilt
Kernel: #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023
(lldb) target create /home/ez/Develop/clang-repl/bin-prebuilt/clang-repl
Current executable set to '/home/ez/Develop/clang-repl/bin-prebuilt/clang-repl' (arm).
(lldb) b main
Breakpoint 1: where = clang-repl`main + 58 at ClangRepl.cpp:142:22, address = 0x00cae62c
(lldb) b Interpreter::CreateExecutor
Breakpoint 2: where = clang-repl`clang::Interpreter::CreateExecutor() + 26 at Interpreter.cpp:368:44, address = 0x0323f3a6
(lldb) r
Process 5715 launched: '/home/ez/.lldb/module_cache/remote-linux/.cache/7D959C71-E942-1D3B-C437-DFFCF1DC872E-E5410846/clang-repl' (arm)
Process 5715 stopped
* thread #1, name = 'clang-repl-jitl', stop reason = breakpoint 1.1
frame #0: 0x010ae62c clang-repl`main(argc=1, argv=0xfffefea4) at ClangRepl.cpp:142:22
(lldb) source info -a $pc
Lines found in module `clang-repl
[0x010ae62c-0x010ae670): /root/clang/tools/clang-repl/ClangRepl.cpp:142:22
(lldb) settings set target.source-map /root /home/ez/Develop/llvm-project
(lldb) b clang/lib/Interpreter/Interpreter.cpp:165
Breakpoint 3: where = clang-repl`clang::IncrementalCompilerBuilder::create(std::vector<char const*, std::allocator<char const*>>&) + 662 at Interpreter.cpp:165:55, address = 0x0363e2f6
(lldb) c
Process 5715 resuming
Process 5715 stopped
* thread #1, name = 'clang-repl-jitl', stop reason = breakpoint 3.1
frame #0: 0x0363e2f6 clang-repl`clang::IncrementalCompilerBuilder::create(ClangArgv=size=6) at Interpreter.cpp:165:55
162 TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer;
163 DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer);
164
-> 165 driver::Driver Driver(/*MainBinaryName=*/ClangArgv[0],
166 llvm::sys::getProcessTriple(), Diags);
167 Driver.setCheckInputsExist(false); // the input comes from mem buffers
168 llvm::ArrayRef<const char *> RF = llvm::ArrayRef(ClangArgv);
...