I decided to start playing around with building my own programming language recently, and to use LLVM to handle the assembly-level details. I'm on Kubuntu 18.04, and I started out using LLVM 6.0 from Kubuntu's packages. I put together code for dealing with my language, then went over the Kaleidoscope tutorials (which have been extremely helpful btw!). I was able to successfully get my own compiler to generate IR using LLVM, use PassManager to write that to a native .o file, use gcc to link that, and execute a tiny program written in my own language. I also decided it was a good time to learn CMake, so I set up my project using that. The CMakeLists.txt file I'm using is essentially just taken from: https://llvm.org/docs/CMake.html#embedding-llvm-in-your-project - though originally it would not link. From scouring the internet I made 2 changes to get that working: replaced "support core irreader" with "all", and replaced "${llvm_libs}" with just "LLVM". However as I was starting to play with setting up JIT, I hit more differences between the version of LLVM in Kubuntu and the version the examples and documentation were written against. So I decided to try to update to a newer version of LLVM.. and this is where I've been stuck for several days now. Here are the steps I've taken: * Uninstalled any llvm packages I could find from Kubuntu's package manager. * Followed the getting started guide: https://llvm.org/docs/GettingStarted.html - I git cloned LLVM, checked out the 10.0.0 tag, ran cmake as instructed, with the Release type. When that completed successfully I ran sudo ninja install. * I then went back to my project and adjusted a couple places to successfully compile against the new version. * At this point I put "${llvm_libs}" in the CMakeLists.txt file back to match the example. However I was getting a massive wall of link errors. * I assumed I must have built LLVM incorrectly somehow, so in an effort to undo that install, I deleted everything I could find under /usr/local that had LLVM in its name, downloaded the 10.0 release from https://releases.llvm.org/download.html for ubuntu 18.04, and extracted that all to /usr/local. * I can still successfully compile, but not link. At this point I'm not sure what to try next. Is there additional documentation somewhere for how to "install" a current release of LLVM correctly? For reference here's my final CMakeLists.txt file: cmake_minimum_required(VERSION 3.10) project(CBreakCompiler) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) add_compile_options(-Wall) find_package(LLVM 10.0.0 REQUIRED CONFIG) message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) add_executable(CBreakCompiler src/main.cpp src/Parser.cpp src/SourceTokenizer.cpp src/IRCompiler.cpp src/CompiledOutput.cpp) llvm_map_components_to_libnames(llvm_libs all) target_link_libraries(CBreakCompiler ${llvm_libs}) And a snippet from the cmake output corresponding to those message lines: -- Found LLVM 10.0.0 -- Using LLVMConfig.cmake in: /usr/local/lib/cmake/llvm There are dozens of link errors.. the first few and last few are: CMakeFiles/CBreakCompiler.dir/src/main.cpp.o:(.data.rel+0x0): undefined reference to `llvm::DisableABIBreakingChecks' CMakeFiles/CBreakCompiler.dir/src/main.cpp.o: In function `std::default_delete<llvm::LLVMContext>::operator()(llvm::LLVMContext*) const': main.cpp:(.text._ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_[_ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_]+0x1e): undefined reference to `llvm::LLVMContext::~LLVMContext()' ... CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0xe0): undefined reference to `llvm::raw_ostream::anchor()' CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0xf8): undefined reference to `typeinfo for llvm::raw_pwrite_stream' CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0x110): undefined reference to `typeinfo for llvm::raw_ostream' -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200514/c777693f/attachment.html>
Rarrum, Kubuntu 20.04 LTS is available. You may be able to upgrade to 19.10, and then to 20.04 without reinstalling. It can be done on Xubuntu. A direct upgrade to 20.04 should become available. LLVM 10 then installs from the distribution packages. I put all this on a VM using KVM/QEMU to keep it isolated from my primary desktop environment. Building a 20.04 VM after upgrading to 20.04 appears to give a faster VM. Use llvm's linker lld. The cmake version for 20.04 is 3.16.3 which should help with llvm's recommended version. Neil On 5/15/20 12:05 AM, Rarrum via llvm-dev wrote:> I decided to start playing around with building my own programming > language recently, and to use LLVM to handle the assembly-level > details. I'm on Kubuntu 18.04, and I started out using LLVM 6.0 from > Kubuntu's packages. I put together code for dealing with my language, > then went over the Kaleidoscope tutorials (which have been extremely > helpful btw!). I was able to successfully get my own compiler to > generate IR using LLVM, use PassManager to write that to a native .o > file, use gcc to link that, and execute a tiny program written in my > own language. > > I also decided it was a good time to learn CMake, so I set up my > project using that. The CMakeLists.txt file I'm using is essentially > just taken from: > https://llvm.org/docs/CMake.html#embedding-llvm-in-your-project - > though originally it would not link. From scouring the internet I > made 2 changes to get that working: replaced "support core irreader" > with "all", and replaced "${llvm_libs}" with just "LLVM". > > However as I was starting to play with setting up JIT, I hit more > differences between the version of LLVM in Kubuntu and the version the > examples and documentation were written against. So I decided to try > to update to a newer version of LLVM.. and this is where I've been > stuck for several days now. Here are the steps I've taken: > > * Uninstalled any llvm packages I could find from Kubuntu's package > manager. > * Followed the getting started guide: > https://llvm.org/docs/GettingStarted.html - I git cloned LLVM, checked > out the 10.0.0 tag, ran cmake as instructed, with the Release type. > When that completed successfully I ran sudo ninja install. > * I then went back to my project and adjusted a couple places to > successfully compile against the new version. > * At this point I put "${llvm_libs}" in the CMakeLists.txt file back > to match the example. However I was getting a massive wall of link > errors. > * I assumed I must have built LLVM incorrectly somehow, so in an > effort to undo that install, I deleted everything I could find under > /usr/local that had LLVM in its name, downloaded the 10.0 release from > https://releases.llvm.org/download.html for ubuntu 18.04, and > extracted that all to /usr/local. > * I can still successfully compile, but not link. > > At this point I'm not sure what to try next. Is there additional > documentation somewhere for how to "install" a current release of LLVM > correctly? > > > For reference here's my final CMakeLists.txt file: > > cmake_minimum_required(VERSION 3.10) > > project(CBreakCompiler) > > set(CMAKE_CXX_STANDARD 17) > set(CMAKE_CXX_STANDARD_REQUIRED True) > add_compile_options(-Wall) > > find_package(LLVM 10.0.0 REQUIRED CONFIG) > > message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") > message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") > > include_directories(${LLVM_INCLUDE_DIRS}) > add_definitions(${LLVM_DEFINITIONS}) > > add_executable(CBreakCompiler > src/main.cpp > src/Parser.cpp > src/SourceTokenizer.cpp > src/IRCompiler.cpp > src/CompiledOutput.cpp) > > llvm_map_components_to_libnames(llvm_libs all) > target_link_libraries(CBreakCompiler ${llvm_libs}) > > > And a snippet from the cmake output corresponding to those message lines: > > -- Found LLVM 10.0.0 > -- Using LLVMConfig.cmake in: /usr/local/lib/cmake/llvm > > > There are dozens of link errors.. the first few and last few are: > > CMakeFiles/CBreakCompiler.dir/src/main.cpp.o:(.data.rel+0x0): > undefined reference to `llvm::DisableABIBreakingChecks' > CMakeFiles/CBreakCompiler.dir/src/main.cpp.o: In function > `std::default_delete<llvm::LLVMContext>::operator()(llvm::LLVMContext*) > const': > main.cpp:(.text._ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_[_ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_]+0x1e): > undefined reference to `llvm::LLVMContext::~LLVMContext()' > ... > CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro > <http://data.rel.ro>+0xe0): undefined reference to > `llvm::raw_ostream::anchor()' > CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro > <http://data.rel.ro>+0xf8): undefined reference to `typeinfo for > llvm::raw_pwrite_stream' > CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro > <http://data.rel.ro>+0x110): undefined reference to `typeinfo for > llvm::raw_ostream' > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200515/9ec506f4/attachment.html>
On Fri, May 15, 2020 at 6:53 PM Neil Nelson via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Rarrum, > > Kubuntu 20.04 LTS is available. You may be able to upgrade to 19.10, and > then to 20.04 without reinstalling. It can be done on Xubuntu. A direct > upgrade to 20.04 should become available. LLVM 10 then installs from the > distribution packages. I put all this on a VM using KVM/QEMU to keep it > isolated from my primary desktop environment. Building a 20.04 VM after > upgrading to 20.04 appears to give a faster VM. Use llvm's linker lld. > > The cmake version for 20.04 is 3.16.3 which should help with llvm's > recommended version. >Do you believe the error listed have to do with the CMake version?> Neil > On 5/15/20 12:05 AM, Rarrum via llvm-dev wrote: > > I decided to start playing around with building my own programming > language recently, and to use LLVM to handle the assembly-level details. > I'm on Kubuntu 18.04, and I started out using LLVM 6.0 from Kubuntu's > packages. I put together code for dealing with my language, then went over > the Kaleidoscope tutorials (which have been extremely helpful btw!). I was > able to successfully get my own compiler to generate IR using LLVM, use > PassManager to write that to a native .o file, use gcc to link that, and > execute a tiny program written in my own language. > > I also decided it was a good time to learn CMake, so I set up my project > using that. The CMakeLists.txt file I'm using is essentially just taken > from: https://llvm.org/docs/CMake.html#embedding-llvm-in-your-project - > though originally it would not link. From scouring the internet I made 2 > changes to get that working: replaced "support core irreader" with "all", > and replaced "${llvm_libs}" with just "LLVM". > > However as I was starting to play with setting up JIT, I hit more > differences between the version of LLVM in Kubuntu and the version the > examples and documentation were written against. So I decided to try to > update to a newer version of LLVM.. and this is where I've been stuck for > several days now. Here are the steps I've taken: > > * Uninstalled any llvm packages I could find from Kubuntu's package > manager. > * Followed the getting started guide: > https://llvm.org/docs/GettingStarted.html - I git cloned LLVM, checked > out the 10.0.0 tag, ran cmake as instructed, with the Release type. When > that completed successfully I ran sudo ninja install. > * I then went back to my project and adjusted a couple places to > successfully compile against the new version. > * At this point I put "${llvm_libs}" in the CMakeLists.txt file back to > match the example. However I was getting a massive wall of link errors. > * I assumed I must have built LLVM incorrectly somehow, so in an effort to > undo that install, I deleted everything I could find under /usr/local that > had LLVM in its name, downloaded the 10.0 release from > https://releases.llvm.org/download.html for ubuntu 18.04, and extracted > that all to /usr/local. > * I can still successfully compile, but not link. > > At this point I'm not sure what to try next. Is there additional > documentation somewhere for how to "install" a current release of LLVM > correctly? > > > For reference here's my final CMakeLists.txt file: > > cmake_minimum_required(VERSION 3.10) > > project(CBreakCompiler) > > set(CMAKE_CXX_STANDARD 17) > set(CMAKE_CXX_STANDARD_REQUIRED True) > add_compile_options(-Wall) > > find_package(LLVM 10.0.0 REQUIRED CONFIG) > > message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") > message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") > > include_directories(${LLVM_INCLUDE_DIRS}) > add_definitions(${LLVM_DEFINITIONS}) > > add_executable(CBreakCompiler > src/main.cpp > src/Parser.cpp > src/SourceTokenizer.cpp > src/IRCompiler.cpp > src/CompiledOutput.cpp) > > llvm_map_components_to_libnames(llvm_libs all) > target_link_libraries(CBreakCompiler ${llvm_libs}) > > > And a snippet from the cmake output corresponding to those message lines: > > -- Found LLVM 10.0.0 > -- Using LLVMConfig.cmake in: /usr/local/lib/cmake/llvm > > > There are dozens of link errors.. the first few and last few are: > > CMakeFiles/CBreakCompiler.dir/src/main.cpp.o:(.data.rel+0x0): undefined > reference to `llvm::DisableABIBreakingChecks' > CMakeFiles/CBreakCompiler.dir/src/main.cpp.o: In function > `std::default_delete<llvm::LLVMContext>::operator()(llvm::LLVMContext*) > const': > main.cpp:(.text._ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_[_ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_]+0x1e): > undefined reference to `llvm::LLVMContext::~LLVMContext()' > ... > CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0xe0): > undefined reference to `llvm::raw_ostream::anchor()' > CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0xf8): > undefined reference to `typeinfo for llvm::raw_pwrite_stream' > CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0x110): > undefined reference to `typeinfo for llvm::raw_ostream' > >Seems like `llvm_map_components_to_libnames` wasn't populated well? I'd start by printing `${llvm_libs}` in your CMake to check the output of llvm_map_components_to_libnames, I don't know how the "all" works for external builds? You may have to list the components you need more explicitly instead? -- Mehdi> > _______________________________________________ > LLVM Developers mailing listllvm-dev at lists.llvm.orghttps://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200515/350b7ba4/attachment.html>