Building issues

I receive the following errors when linking against llvm.

cmake_minimum_required(VERSION 3.22)


find_package(LLVM REQUIRED CONFIG)

message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

add_library(donsus_lib STATIC
        src/handle_file.cc
        src/lexer.cc
        src/runner.cc
        src/sema.cc
        src/ir.cc

        # type
        src/type.cc

        #parser
        src/parser_util.cc
        src/parser.cc

        # symtable
        src/symbol_table.cc

        # codegen
        src/codegen/codegen.cc

        #utility
        src/utility/handle.h
        src/utility/macros.h
        src/utility/memory_alloc.h
        src/utility/memory_alloc.cc
        src/utility/slices.h
        src/utility/exception.cc
        src/utility/exception.h

        #ast
        src/ast/node.cc
        src/ast/tree.cc

        # optimisation
        src/optimisation_ast.cc
)


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

llvm_map_components_to_libnames(llvm_libs all)

set(CMAKE_BUILD_TYPE Debug)

#[[
add_compile_options(-fsanitize=address) # ASAN
add_link_options(-fsanitize=address) # ASAN
]]


target_include_directories(donsus_lib PUBLIC "${PROJECT_SOURCE_DIR}/Include")
target_include_directories(donsus_lib PUBLIC "${PROJECT_SOURCE_DIR}/Include/codegen")
target_include_directories(donsus_lib PUBLIC "${PROJECT_SOURCE_DIR}/Include/Internal")

add_executable(donsus src/main.cc)

target_link_libraries(donsus_lib PUBLIC ${llvm_libs})
#[[target_link_libraries(donsus_lib PUBLIC ${llvm_libs})]]
target_link_libraries(donsus PUBLIC donsus_lib)


add_subdirectory(donsus_test)

The error:

/home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:70: undefined reference to `llvm::sys::getDefaultTargetTriple[abi:cxx11]()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:74: undefined reference to `llvm::TargetRegistry::lookupTarget(llvm::StringRef, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:76: undefined reference to `llvm::errs()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:87: undefined reference to `llvm::Module::setDataLayout(llvm::DataLayout const&)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:87: undefined reference to `llvm::DataLayout::~DataLayout()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:91: undefined reference to `llvm::raw_fd_ostream::raw_fd_ostream(llvm::StringRef, std::error_code&, llvm::sys::fs::OpenFlags)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:94: undefined reference to `llvm::errs()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:98: undefined reference to `llvm::legacy::PassManager::PassManager()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:102: undefined reference to `llvm::errs()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:106: undefined reference to `llvm::legacy::PassManager::run(llvm::Module&)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:109: undefined reference to `llvm::outs()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:121: undefined reference to `llvm::legacy::PassManager::~PassManager()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:121: undefined reference to `llvm::raw_fd_ostream::~raw_fd_ostream()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:87: undefined reference to `llvm::DataLayout::~DataLayout()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:121: undefined reference to `llvm::legacy::PassManager::~PassManager()'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/runner.cc:121: undefined reference to `llvm::raw_fd_ostream::~raw_fd_ostream()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::raw_ostream::flush()':
/usr/include/llvm/Support/raw_ostream.h:187: undefined reference to `llvm::raw_ostream::flush_nonempty()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::raw_ostream::operator<<(llvm::StringRef)':
/usr/include/llvm/Support/raw_ostream.h:217: undefined reference to `llvm::raw_ostream::write(char const*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::raw_ostream::operator<<(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/usr/include/llvm/Support/raw_ostream.h:249: undefined reference to `llvm::raw_ostream::write(char const*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::DataLayout::operator=(llvm::DataLayout const&)':
/usr/include/llvm/IR/DataLayout.h:205: undefined reference to `llvm::DataLayout::clear()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::IRBuilderDefaultInserter::IRBuilderDefaultInserter()':
/usr/include/llvm/IR/IRBuilder.h:61: undefined reference to `vtable for llvm::IRBuilderDefaultInserter'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::Target::createTargetMachine(llvm::StringRef, llvm::StringRef, llvm::StringRef, llvm::TargetOptions const&, std::optional<llvm::Reloc::Model>, std::optional<llvm::CodeModel::Model>, llvm::CodeGenOpt::Level, bool) const':
/usr/include/llvm/MC/TargetRegistry.h:488: undefined reference to `llvm::Triple::Triple(llvm::Twine const&)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::InitializeAllTargetInfos()':
/usr/include/llvm/Config/Targets.def:26: undefined reference to `LLVMInitializeAArch64TargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:27: undefined reference to `LLVMInitializeAMDGPUTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:28: undefined reference to `LLVMInitializeARMTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:29: undefined reference to `LLVMInitializeAVRTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:30: undefined reference to `LLVMInitializeBPFTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:31: undefined reference to `LLVMInitializeHexagonTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:32: undefined reference to `LLVMInitializeLanaiTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:33: undefined reference to `LLVMInitializeLoongArchTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:34: undefined reference to `LLVMInitializeMipsTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:35: undefined reference to `LLVMInitializeMSP430TargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:36: undefined reference to `LLVMInitializeNVPTXTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:37: undefined reference to `LLVMInitializePowerPCTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:38: undefined reference to `LLVMInitializeRISCVTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:39: undefined reference to `LLVMInitializeSparcTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:40: undefined reference to `LLVMInitializeSystemZTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:41: undefined reference to `LLVMInitializeVETargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:42: undefined reference to `LLVMInitializeWebAssemblyTargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:43: undefined reference to `LLVMInitializeX86TargetInfo'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:44: undefined reference to `LLVMInitializeXCoreTargetInfo'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::InitializeAllTargets()':
/usr/include/llvm/Config/Targets.def:26: undefined reference to `LLVMInitializeAArch64Target'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:27: undefined reference to `LLVMInitializeAMDGPUTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:28: undefined reference to `LLVMInitializeARMTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:29: undefined reference to `LLVMInitializeAVRTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:30: undefined reference to `LLVMInitializeBPFTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:31: undefined reference to `LLVMInitializeHexagonTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:32: undefined reference to `LLVMInitializeLanaiTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:33: undefined reference to `LLVMInitializeLoongArchTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:34: undefined reference to `LLVMInitializeMipsTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:35: undefined reference to `LLVMInitializeMSP430Target'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:36: undefined reference to `LLVMInitializeNVPTXTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:37: undefined reference to `LLVMInitializePowerPCTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:38: undefined reference to `LLVMInitializeRISCVTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:39: undefined reference to `LLVMInitializeSparcTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:40: undefined reference to `LLVMInitializeSystemZTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:41: undefined reference to `LLVMInitializeVETarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:42: undefined reference to `LLVMInitializeWebAssemblyTarget'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:43: undefined reference to `LLVMInitializeX86Target'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:44: undefined reference to `LLVMInitializeXCoreTarget'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::InitializeAllTargetMCs()':
/usr/include/llvm/Config/Targets.def:26: undefined reference to `LLVMInitializeAArch64TargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:27: undefined reference to `LLVMInitializeAMDGPUTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:28: undefined reference to `LLVMInitializeARMTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:29: undefined reference to `LLVMInitializeAVRTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:30: undefined reference to `LLVMInitializeBPFTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:31: undefined reference to `LLVMInitializeHexagonTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:32: undefined reference to `LLVMInitializeLanaiTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:33: undefined reference to `LLVMInitializeLoongArchTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:34: undefined reference to `LLVMInitializeMipsTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:35: undefined reference to `LLVMInitializeMSP430TargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:36: undefined reference to `LLVMInitializeNVPTXTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:37: undefined reference to `LLVMInitializePowerPCTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:38: undefined reference to `LLVMInitializeRISCVTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:39: undefined reference to `LLVMInitializeSparcTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:40: undefined reference to `LLVMInitializeSystemZTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:41: undefined reference to `LLVMInitializeVETargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:42: undefined reference to `LLVMInitializeWebAssemblyTargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:43: undefined reference to `LLVMInitializeX86TargetMC'
/usr/bin/ld: /usr/include/llvm/Config/Targets.def:44: undefined reference to `LLVMInitializeXCoreTargetMC'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::InitializeAllAsmPrinters()':
/usr/include/llvm/Config/AsmPrinters.def:27: undefined reference to `LLVMInitializeAArch64AsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:28: undefined reference to `LLVMInitializeAMDGPUAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:29: undefined reference to `LLVMInitializeARMAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:30: undefined reference to `LLVMInitializeAVRAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:31: undefined reference to `LLVMInitializeBPFAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:32: undefined reference to `LLVMInitializeHexagonAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:33: undefined reference to `LLVMInitializeLanaiAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:34: undefined reference to `LLVMInitializeLoongArchAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:35: undefined reference to `LLVMInitializeMipsAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:36: undefined reference to `LLVMInitializeMSP430AsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:37: undefined reference to `LLVMInitializeNVPTXAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:38: undefined reference to `LLVMInitializePowerPCAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:39: undefined reference to `LLVMInitializeRISCVAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:40: undefined reference to `LLVMInitializeSparcAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:41: undefined reference to `LLVMInitializeSystemZAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:42: undefined reference to `LLVMInitializeVEAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:43: undefined reference to `LLVMInitializeWebAssemblyAsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:44: undefined reference to `LLVMInitializeX86AsmPrinter'
/usr/bin/ld: /usr/include/llvm/Config/AsmPrinters.def:45: undefined reference to `LLVMInitializeXCoreAsmPrinter'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::InitializeAllAsmParsers()':
/usr/include/llvm/Config/AsmParsers.def:27: undefined reference to `LLVMInitializeAArch64AsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:28: undefined reference to `LLVMInitializeAMDGPUAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:29: undefined reference to `LLVMInitializeARMAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:30: undefined reference to `LLVMInitializeAVRAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:31: undefined reference to `LLVMInitializeBPFAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:32: undefined reference to `LLVMInitializeHexagonAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:33: undefined reference to `LLVMInitializeLanaiAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:34: undefined reference to `LLVMInitializeLoongArchAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:35: undefined reference to `LLVMInitializeMipsAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:36: undefined reference to `LLVMInitializeMSP430AsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:37: undefined reference to `LLVMInitializePowerPCAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:38: undefined reference to `LLVMInitializeRISCVAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:39: undefined reference to `LLVMInitializeSparcAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:40: undefined reference to `LLVMInitializeSystemZAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:41: undefined reference to `LLVMInitializeVEAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:42: undefined reference to `LLVMInitializeWebAssemblyAsmParser'
/usr/bin/ld: /usr/include/llvm/Config/AsmParsers.def:43: undefined reference to `LLVMInitializeX86AsmParser'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::TargetOptions::TargetOptions()':
/usr/include/llvm/Target/TargetOptions.h:147: undefined reference to `llvm::MCTargetOptions::MCTargetOptions()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned int, void>::end() const':
/usr/include/llvm/ADT/SmallVector.h:273: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned char, void>::end() const':
/usr/include/llvm/ADT/SmallVector.h:273: undefined reference to `llvm::SmallVectorBase<unsigned long>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<std::pair<unsigned int, llvm::MDNode*>, void>::end()':
/usr/include/llvm/ADT/SmallVector.h:272: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `std::__detail::_MakeUniq<llvm::LLVMContext>::__single_object std::make_unique<llvm::LLVMContext>()':
/usr/include/c++/13/bits/unique_ptr.h:1070: undefined reference to `llvm::LLVMContext::LLVMContext()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `std::__detail::_MakeUniq<llvm::Module>::__single_object std::make_unique<llvm::Module, char const (&) [10], llvm::LLVMContext&>(char const (&) [10], llvm::LLVMContext&)':
/usr/include/c++/13/bits/unique_ptr.h:1070: undefined reference to `llvm::Module::Module(llvm::StringRef, llvm::LLVMContext&)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned int, void>::end()':
/usr/include/llvm/ADT/SmallVector.h:272: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned char, void>::end()':
/usr/include/llvm/ADT/SmallVector.h:272: undefined reference to `llvm::SmallVectorBase<unsigned long>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::LayoutAlignElem, void>::end()':
/usr/include/llvm/ADT/SmallVector.h:272: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::PointerAlignElem, void>::end()':
/usr/include/llvm/ADT/SmallVector.h:272: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorImpl<unsigned char>::operator=(llvm::SmallVectorImpl<unsigned char> const&)':
/usr/include/llvm/ADT/SmallVector.h:1015: undefined reference to `llvm::SmallVectorBase<unsigned long>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1016: undefined reference to `llvm::SmallVectorBase<unsigned long>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1029: undefined reference to `llvm::SmallVectorBase<unsigned long>::set_size(unsigned long)'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1036: undefined reference to `llvm::SmallVectorBase<unsigned long>::capacity() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1051: undefined reference to `llvm::SmallVectorBase<unsigned long>::set_size(unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorImpl<llvm::LayoutAlignElem>::operator=(llvm::SmallVectorImpl<llvm::LayoutAlignElem> const&)':
/usr/include/llvm/ADT/SmallVector.h:1015: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1016: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1029: undefined reference to `llvm::SmallVectorBase<unsigned int>::set_size(unsigned long)'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1036: undefined reference to `llvm::SmallVectorBase<unsigned int>::capacity() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1051: undefined reference to `llvm::SmallVectorBase<unsigned int>::set_size(unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorImpl<llvm::PointerAlignElem>::operator=(llvm::SmallVectorImpl<llvm::PointerAlignElem> const&)':
/usr/include/llvm/ADT/SmallVector.h:1015: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1016: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1029: undefined reference to `llvm::SmallVectorBase<unsigned int>::set_size(unsigned long)'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1036: undefined reference to `llvm::SmallVectorBase<unsigned int>::capacity() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1051: undefined reference to `llvm::SmallVectorBase<unsigned int>::set_size(unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorImpl<unsigned int>::operator=(llvm::SmallVectorImpl<unsigned int> const&)':
/usr/include/llvm/ADT/SmallVector.h:1015: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1016: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1029: undefined reference to `llvm::SmallVectorBase<unsigned int>::set_size(unsigned long)'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1036: undefined reference to `llvm::SmallVectorBase<unsigned int>::capacity() const'
/usr/bin/ld: /usr/include/llvm/ADT/SmallVector.h:1051: undefined reference to `llvm::SmallVectorBase<unsigned int>::set_size(unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `std::default_delete<llvm::LLVMContext>::operator()(llvm::LLVMContext*) const':
/usr/include/c++/13/bits/unique_ptr.h:99: undefined reference to `llvm::LLVMContext::~LLVMContext()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `std::default_delete<llvm::Module>::operator()(llvm::Module*) const':
/usr/include/c++/13/bits/unique_ptr.h:99: undefined reference to `llvm::Module::~Module()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::IRBuilderFolder::IRBuilderFolder()':
/usr/include/llvm/IR/IRBuilderFolder.h:24: undefined reference to `vtable for llvm::IRBuilderFolder'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::ConstantFolder::ConstantFolder()':
/usr/include/llvm/IR/ConstantFolder.h:34: undefined reference to `vtable for llvm::ConstantFolder'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::ConstantFolder::~ConstantFolder()':
/usr/include/llvm/IR/ConstantFolder.h:30: undefined reference to `vtable for llvm::ConstantFolder'
/usr/bin/ld: /usr/include/llvm/IR/ConstantFolder.h:30: undefined reference to `llvm::IRBuilderFolder::~IRBuilderFolder()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::IRBuilder<llvm::ConstantFolder, llvm::IRBuilderDefaultInserter>::~IRBuilder()':
/usr/include/llvm/IR/IRBuilder.h:2595: undefined reference to `llvm::IRBuilderDefaultInserter::~IRBuilderDefaultInserter()'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::LayoutAlignElem, void>::end() const':
/usr/include/llvm/ADT/SmallVector.h:273: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::PointerAlignElem, void>::end() const':
/usr/include/llvm/ADT/SmallVector.h:273: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned int, void>::SmallVectorTemplateCommon(unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:138: undefined reference to `llvm::SmallVectorBase<unsigned int>::SmallVectorBase(void*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned char, void>::SmallVectorTemplateCommon(unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:138: undefined reference to `llvm::SmallVectorBase<unsigned long>::SmallVectorBase(void*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::LayoutAlignElem, void>::SmallVectorTemplateCommon(unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:138: undefined reference to `llvm::SmallVectorBase<unsigned int>::SmallVectorBase(void*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::PointerAlignElem, void>::SmallVectorTemplateCommon(unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:138: undefined reference to `llvm::SmallVectorBase<unsigned int>::SmallVectorBase(void*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned char, void>::grow_pod(unsigned long, unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:141: undefined reference to `llvm::SmallVectorBase<unsigned long>::grow_pod(void*, unsigned long, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::LayoutAlignElem, void>::grow_pod(unsigned long, unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:141: undefined reference to `llvm::SmallVectorBase<unsigned int>::grow_pod(void*, unsigned long, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<llvm::PointerAlignElem, void>::grow_pod(unsigned long, unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:141: undefined reference to `llvm::SmallVectorBase<unsigned int>::grow_pod(void*, unsigned long, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<unsigned int, void>::grow_pod(unsigned long, unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:141: undefined reference to `llvm::SmallVectorBase<unsigned int>::grow_pod(void*, unsigned long, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(runner.cc.o): in function `llvm::SmallVectorTemplateCommon<std::pair<unsigned int, llvm::MDNode*>, void>::SmallVectorTemplateCommon(unsigned long)':
/usr/include/llvm/ADT/SmallVector.h:138: undefined reference to `llvm::SmallVectorBase<unsigned int>::SmallVectorBase(void*, unsigned long)'
/usr/bin/ld: libdonsus_lib.a(sema.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
/usr/bin/ld: libdonsus_lib.a(parser.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
/usr/bin/ld: libdonsus_lib.a(symbol_table.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `DonsusCodegen::DonsusCodeGenerator::create_entry_point()':
/home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:18: undefined reference to `llvm::Type::getInt32Ty(llvm::LLVMContext&)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:18: undefined reference to `llvm::FunctionType::get(llvm::Type*, bool)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:21: undefined reference to `llvm::Function::Create(llvm::FunctionType*, llvm::GlobalValue::LinkageTypes, llvm::Twine const&, llvm::Module&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `DonsusCodegen::DonsusCodeGenerator::DonsusCodeGenerator(std::unique_ptr<llvm::LLVMContext, std::default_delete<llvm::LLVMContext> >, std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >, std::unique_ptr<llvm::IRBuilder<llvm::ConstantFolder, llvm::IRBuilderDefaultInserter>, std::default_delete<llvm::IRBuilder<llvm::ConstantFolder, llvm::IRBuilderDefaultInserter> > >)':
/home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:93: undefined reference to `llvm::Module::getFunction(llvm::StringRef) const'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `DonsusCodegen::DonsusCodeGenerator::visit(utility::handle<donsus_ast::node>&, donsus_ast::variable_decl&, utility::handle<DonsusSymTable>&, bool)':
/home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:129: undefined reference to `llvm::ConstantInt::get(llvm::LLVMContext&, llvm::APInt const&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `DonsusCodegen::DonsusCodeGenerator::visit(utility::handle<donsus_ast::node>&, donsus_ast::number_expr&, utility::handle<DonsusSymTable>&)':
/home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:193: undefined reference to `llvm::ConstantInt::get(llvm::LLVMContext&, llvm::APInt const&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `DonsusCodegen::DonsusCodeGenerator::visit(utility::handle<donsus_ast::node>&, donsus_ast::print_expr&, utility::handle<DonsusSymTable>&)':
/home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:250: undefined reference to `llvm::Type::getInt8Ty(llvm::LLVMContext&)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:250: undefined reference to `llvm::PointerType::get(llvm::Type*, unsigned int)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:249: undefined reference to `llvm::Type::getInt32Ty(llvm::LLVMContext&)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:246: undefined reference to `llvm::FunctionType::get(llvm::Type*, llvm::ArrayRef<llvm::Type*>, bool)'
/usr/bin/ld: /home/tamashadhazy/coding/donsus/Donsus/src/codegen/codegen.cc:246: undefined reference to `llvm::Module::getOrInsertFunction(llvm::StringRef, llvm::FunctionType*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::BasicBlock::Create(llvm::LLVMContext&, llvm::Twine const&, llvm::Function*, llvm::BasicBlock*)':
/usr/include/llvm/IR/BasicBlock.h:108: undefined reference to `llvm::BasicBlock::BasicBlock(llvm::LLVMContext&, llvm::Twine const&, llvm::Function*, llvm::BasicBlock*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::BasicBlock::getModule()':
/usr/include/llvm/IR/BasicBlock.h:122: undefined reference to `llvm::BasicBlock::getModule() const'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::UnaryInstruction::operator new(unsigned long)':
/usr/include/llvm/IR/InstrTypes.h:69: undefined reference to `llvm::User::operator new(unsigned long, unsigned int)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::UnaryInstruction::operator delete(void*)':
/usr/include/llvm/IR/InstrTypes.h:70: undefined reference to `llvm::User::operator delete(void*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::BinaryOperator::CreateUDiv(llvm::Value*, llvm::Value*, llvm::Twine const&)':
/usr/include/llvm/IR/Instruction.def:153: undefined reference to `llvm::BinaryOperator::Create(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::Instruction*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::BinaryOperator::CreateExact(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&)':
/usr/include/llvm/IR/InstrTypes.h:322: undefined reference to `llvm::BinaryOperator::Create(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::Instruction*)'
/usr/bin/ld: /usr/include/llvm/IR/InstrTypes.h:323: undefined reference to `llvm::Instruction::setIsExact(bool)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::StoreInst::operator new(unsigned long)':
/usr/include/llvm/IR/Instructions.h:333: undefined reference to `llvm::User::operator new(unsigned long, unsigned int)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::StoreInst::operator delete(void*)':
/usr/include/llvm/IR/Instructions.h:334: undefined reference to `llvm::User::operator delete(void*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::APInt::APInt(unsigned int, unsigned long, bool)':
/usr/include/llvm/ADT/APInt.h:115: undefined reference to `llvm::APInt::initSlowCase(unsigned long, bool)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::ConstantExpr::getGetElementPtr(llvm::Type*, llvm::Constant*, llvm::ArrayRef<llvm::Constant*>, bool, std::optional<unsigned int>, llvm::Type*)':
/usr/include/llvm/IR/Constants.h:1231: undefined reference to `llvm::ConstantExpr::getGetElementPtr(llvm::Type*, llvm::Constant*, llvm::ArrayRef<llvm::Value*>, bool, std::optional<unsigned int>, llvm::Type*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::AddMetadataToInst(llvm::Instruction*) const':
/usr/include/llvm/IR/IRBuilder.h:235: undefined reference to `llvm::Instruction::setMetadata(unsigned int, llvm::MDNode*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::getInt8Ty()':
/usr/include/llvm/IR/IRBuilder.h:503: undefined reference to `llvm::Type::getInt8Ty(llvm::LLVMContext&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::getInt16Ty()':
/usr/include/llvm/IR/IRBuilder.h:508: undefined reference to `llvm::Type::getInt16Ty(llvm::LLVMContext&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::getInt32Ty()':
/usr/include/llvm/IR/IRBuilder.h:513: undefined reference to `llvm::Type::getInt32Ty(llvm::LLVMContext&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::getInt64Ty()':
/usr/include/llvm/IR/IRBuilder.h:518: undefined reference to `llvm::Type::getInt64Ty(llvm::LLVMContext&)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::CreateInsertNUWNSWBinOp(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, bool, bool)':
/usr/include/llvm/IR/IRBuilder.h:1228: undefined reference to `llvm::BinaryOperator::Create(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::Instruction*)'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1229: undefined reference to `llvm::Instruction::setHasNoUnsignedWrap(bool)'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1230: undefined reference to `llvm::Instruction::setHasNoSignedWrap(bool)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::CreateAlloca(llvm::Type*, llvm::Value*, llvm::Twine const&)':
/usr/include/llvm/IR/IRBuilder.h:1740: undefined reference to `llvm::Module::getDataLayout() const'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1741: undefined reference to `llvm::DataLayout::getPrefTypeAlign(llvm::Type*) const'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1743: undefined reference to `llvm::AllocaInst::AllocaInst(llvm::Type*, unsigned int, llvm::Value*, llvm::Align, llvm::Twine const&, llvm::Instruction*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::CreateAlignedLoad(llvm::Type*, llvm::Value*, llvm::MaybeAlign, bool, llvm::Twine const&)':
/usr/include/llvm/IR/IRBuilder.h:1778: undefined reference to `llvm::Module::getDataLayout() const'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1779: undefined reference to `llvm::DataLayout::getABITypeAlign(llvm::Type*) const'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1781: undefined reference to `llvm::LoadInst::LoadInst(llvm::Type*, llvm::Value*, llvm::Twine const&, bool, llvm::Align, llvm::Instruction*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::CreateAlignedStore(llvm::Value*, llvm::Value*, llvm::MaybeAlign, bool)':
/usr/include/llvm/IR/IRBuilder.h:1787: undefined reference to `llvm::Module::getDataLayout() const'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1788: undefined reference to `llvm::DataLayout::getABITypeAlign(llvm::Type*) const'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1790: undefined reference to `llvm::StoreInst::StoreInst(llvm::Value*, llvm::Value*, bool, llvm::Align, llvm::Instruction*)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::IRBuilderBase::CreateGlobalStringPtr(llvm::StringRef, llvm::Twine const&, unsigned int, llvm::Module*)':
/usr/include/llvm/IR/IRBuilder.h:1944: undefined reference to `llvm::IRBuilderBase::CreateGlobalString(llvm::StringRef, llvm::Twine const&, unsigned int, llvm::Module*)'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1945: undefined reference to `llvm::Type::getInt32Ty(llvm::LLVMContext&)'
/usr/bin/ld: /usr/include/llvm/IR/IRBuilder.h:1945: undefined reference to `llvm::ConstantInt::get(llvm::IntegerType*, unsigned long, bool)'
/usr/bin/ld: libdonsus_lib.a(codegen.cc.o): in function `llvm::SmallVectorTemplateCommon<std::pair<unsigned int, llvm::MDNode*>, void>::end() const':
/usr/include/llvm/ADT/SmallVector.h:273: undefined reference to `llvm::SmallVectorBase<unsigned int>::size() const'
/usr/bin/ld: libdonsus_lib.a(tree.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
/usr/bin/ld: libdonsus_lib.a(lexer.cc.o):/usr/include/llvm/Config/abi-breaking.h:53: undefined reference to `llvm::DisableABIBreakingChecks'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/donsus.dir/build.make:98: donsus] Error 1
make[1]: *** [CMakeFiles/Makefile2:289: CMakeFiles/donsus.dir/all] Error 2

runner.cc

// Running each step in the compiler
#include "../Include/codegen/codegen.h"
#include "../Include/file.h"
#include "../Include/sema.h"

#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/TargetParser/Host.h"

// https://stackoverflow.com/questions/56894943/using-passmanager-in-llvm-6
#include "llvm/IR/LegacyPassManager.h"

#include <iostream>

DonsusParser::end_result Du_Parse(std::string result) {
  // Lexer
  donsus_lexer lexer(result); // initialise lexer
  DonsusParser parser(lexer);
  // Parser
  DonsusParser::end_result parser_result = parser.donsus_parse();
  return parser_result;
}

int Du_Main(int argc, char **argv) {
  std::string result = handle_file(argv[1]);
  std::string path = argv[1]; // Obtain path
  std::string base_filename =
      path.substr(path.find_last_of("/\\") + 1); // Obtain file name from path

  std::string::size_type p(base_filename.find_last_of('.'));

  std::string file_without_extension =
      base_filename.substr(0, p); // Obtain file without the extension(.du)

  utility::handle<DonsusSymTable> sym_global = new DonsusSymTable();

  DonsusParser::end_result parser_result = Du_Parse(result);

  // codegen
  std::unique_ptr<llvm::LLVMContext> TheContext =
      std::make_unique<llvm::LLVMContext>();
  std::unique_ptr<llvm::Module> TheModule =
      std::make_unique<llvm::Module>("Donsus IR", *TheContext);
  std::unique_ptr<llvm::IRBuilder<>> TheBuilder =
      std::make_unique<llvm::IRBuilder<>>(*TheContext);

  DonsusCodegen::DonsusCodeGenerator codegen(
      std::move(TheContext), std::move(TheModule), std::move(TheBuilder));

  // sema
  parser_result->init_traverse();
  parser_result->traverse(donsus_sym, assign_type_to_node, sym_global, codegen);

  // Todo: This section can be implemented inside codegen.cc as 2 methods
  // Initialize the target registry etc.
  llvm::InitializeAllTargetInfos();
  llvm::InitializeAllTargets();
  llvm::InitializeAllTargetMCs();
  llvm::InitializeAllAsmParsers();
  llvm::InitializeAllAsmPrinters();

  auto TargetTriple = llvm::sys::getDefaultTargetTriple();
  codegen.TheModule->setTargetTriple(TargetTriple);

  std::string Error;
  auto Target = llvm::TargetRegistry::lookupTarget(TargetTriple, Error);
  if (!Target) {
    llvm::errs() << Error;
    return 1;
  }

  auto CPU = "generic";
  auto Features = "";

  llvm::TargetOptions opt;
  auto TheTargetMachine = Target->createTargetMachine(
      TargetTriple, CPU, Features, opt, llvm::Reloc::PIC_);

  codegen.TheModule->setDataLayout(TheTargetMachine->createDataLayout());

  auto Filename = "output.o";
  std::error_code EC;
  llvm::raw_fd_ostream dest(Filename, EC, llvm::sys::fs::OF_None);

  if (EC) {
    llvm::errs() << "Could not open file: " << EC.message();
    return 1;
  }

  llvm::legacy::PassManager pass;
  const auto FileType = llvm::CGFT_ObjectFile;

  if (TheTargetMachine->addPassesToEmitFile(pass, dest, nullptr, FileType)) {
    llvm::errs() << "TheTargetMachine can't emit a file of this type";
    return 1;
  }

  pass.run(*TheModule);
  dest.flush();

  llvm::outs() << "Wrote " << Filename << "\n";

  // codegen
#ifdef DEBUG
  std::cout << "\n";
  std::cout << "SYMBOL TABLE:" << std::endl;
  std::cout << "GLOBAL: " << std::endl;
  std::cout << sym_global << std::endl;
#endif

  /*  delete sym_global.get();*/
  return 0;
}