From 30006b51433c0f2cf1bf5f2fa3f3f2c612a74157 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 24 Mar 2022 18:22:29 +0300 Subject: [PATCH] [K/N] Add CMakeLists.txt to simplify work with libllvmext Also moved functions that have nothing to do with code coverage into a separate file. --- kotlin-native/.gitignore | 1 - kotlin-native/backend.native/llvm.def | 4 +- kotlin-native/libllvmext/CMakeLists.txt | 44 +++++++++++++++++ kotlin-native/libllvmext/build.gradle.kts | 7 +++ .../src/main/cpp/CAPIExtensions.cpp | 49 +++++++++++++++++++ .../src/main/cpp/CoverageMappingC.cpp | 37 -------------- .../src/main/include/CAPIExtensions.h | 28 +++++++++++ 7 files changed, 130 insertions(+), 40 deletions(-) create mode 100644 kotlin-native/libllvmext/CMakeLists.txt create mode 100644 kotlin-native/libllvmext/src/main/cpp/CAPIExtensions.cpp create mode 100644 kotlin-native/libllvmext/src/main/include/CAPIExtensions.h diff --git a/kotlin-native/.gitignore b/kotlin-native/.gitignore index 6bbb7fae7a4..bae104d23c4 100644 --- a/kotlin-native/.gitignore +++ b/kotlin-native/.gitignore @@ -57,7 +57,6 @@ backend.native/tests/teamcity-test.property samples/**/*.kt.bc-build # CMake -libllvmext/CMakeLists.txt tools/performance-server/node_modules tools/performance-server/server tools/performance-server/ui/js diff --git a/kotlin-native/backend.native/llvm.def b/kotlin-native/backend.native/llvm.def index fa04203ec42..4ae8ab8607a 100644 --- a/kotlin-native/backend.native/llvm.def +++ b/kotlin-native/backend.native/llvm.def @@ -1,9 +1,9 @@ headers = llvm-c/Core.h llvm-c/Target.h llvm-c/Analysis.h llvm-c/BitWriter.h \ llvm-c/BitReader.h llvm-c/Transforms/PassManagerBuilder.h llvm-c/Transforms/IPO.h \ llvm-c/TargetMachine.h llvm-c/Target.h llvm-c/Linker.h llvm-c/Initialization.h \ - llvm-c/DebugInfo.h DebugInfoC.h CoverageMappingC.h + llvm-c/DebugInfo.h DebugInfoC.h CoverageMappingC.h CAPIExtensions.h -headerFilter = llvm-c/* llvm-c/**/* DebugInfoC.h CoverageMappingC.h +headerFilter = llvm-c/* llvm-c/**/* DebugInfoC.h CoverageMappingC.h CAPIExtensions.h compilerOpts = -std=c99 \ -Wall -W -Wno-unused-parameter -Wwrite-strings -Wmissing-field-initializers \ diff --git a/kotlin-native/libllvmext/CMakeLists.txt b/kotlin-native/libllvmext/CMakeLists.txt new file mode 100644 index 00000000000..e6e430be6a8 --- /dev/null +++ b/kotlin-native/libllvmext/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.20) +project(libllvmext) + +set(CMAKE_CXX_STANDARD 17) + +function(find_llvm_dir) + message(STATUS "Loading LLVM dependency location from Gradle...") + # TODO: Check on Windows. + execute_process( + COMMAND ../../gradlew printLlvmDir -q + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE llvm_dir + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(LLVM_DIR ${llvm_dir} PARENT_SCOPE) +endfunction(find_llvm_dir) + +if (NOT DEFINED LLVM_DIR) + find_llvm_dir() +endif () +if (LLVM_DIR STREQUAL "") + message(FATAL_ERROR "LLVM_DIR is not set!") +else() + message(STATUS "LLVM location: ${LLVM_DIR}") +endif() +list(APPEND CMAKE_PREFIX_PATH "${LLVM_DIR}/lib/cmake") +find_package(LLVM REQUIRED CONFIG) + +message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") +message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") + +if (CMAKE_SYSTEM_NAME MATCHES Darwin) + add_compile_definitions(KONAN_MACOS=1) +elseif (CMAKE_SYSTEM_NAME MATCHES Linux) + add_compile_definitions(KONAN_LINUX=1) +elseif (CMAKE_SYSTEM_NAME MATCHES Windows) + add_compile_definitions(KONAN_WINDOWS=1) +endif () + +set(SRC_DIR ${CMAKE_SOURCE_DIR}/src) +include_directories(${LLVM_INCLUDE_DIRS}) +include_directories(${SRC_DIR}/main/include) + +add_library(libllvmext ${SRC_DIR}/main/cpp/CoverageMappingC.cpp ${SRC_DIR}/main/cpp/CAPIExtensions.cpp) diff --git a/kotlin-native/libllvmext/build.gradle.kts b/kotlin-native/libllvmext/build.gradle.kts index 5edf4042e4e..6c9637710ee 100644 --- a/kotlin-native/libllvmext/build.gradle.kts +++ b/kotlin-native/libllvmext/build.gradle.kts @@ -62,3 +62,10 @@ native { flags("-qv", ruleOut(), *ruleInAll()) } } + + +val printLlvmDir by tasks.registering { + doLast { + println(project.findProperty("llvmDir")) + } +} diff --git a/kotlin-native/libllvmext/src/main/cpp/CAPIExtensions.cpp b/kotlin-native/libllvmext/src/main/cpp/CAPIExtensions.cpp new file mode 100644 index 00000000000..2f41a7ed387 --- /dev/null +++ b/kotlin-native/libllvmext/src/main/cpp/CAPIExtensions.cpp @@ -0,0 +1,49 @@ +// +// Created by Sergey.Bogolepov on 24.03.2022. +// + +#include +#include +#include +#include +#include +#include +#include + +using namespace llvm; + +void LLVMAddObjCARCContractPass(LLVMPassManagerRef passManagerRef) { + legacy::PassManagerBase *passManager = unwrap(passManagerRef); + passManager->add(createObjCARCContractPass()); +} + +void LLVMKotlinInitializeTargets() { +#define INIT_LLVM_TARGET(TargetName) \ + LLVMInitialize##TargetName##TargetInfo();\ + LLVMInitialize##TargetName##Target();\ + LLVMInitialize##TargetName##TargetMC(); +#if KONAN_MACOS + INIT_LLVM_TARGET(AArch64) + INIT_LLVM_TARGET(ARM) + INIT_LLVM_TARGET(Mips) + INIT_LLVM_TARGET(X86) + INIT_LLVM_TARGET(WebAssembly) +#elif KONAN_LINUX + INIT_LLVM_TARGET(AArch64) + INIT_LLVM_TARGET(ARM) + INIT_LLVM_TARGET(Mips) + INIT_LLVM_TARGET(X86) + INIT_LLVM_TARGET(WebAssembly) +#elif KONAN_WINDOWS + INIT_LLVM_TARGET(AArch64) + INIT_LLVM_TARGET(ARM) + INIT_LLVM_TARGET(X86) + INIT_LLVM_TARGET(WebAssembly) +#endif + +#undef INIT_LLVM_TARGET +} + +void LLVMSetNoTailCall(LLVMValueRef Call) { + unwrap(Call)->setTailCallKind(CallInst::TCK_NoTail); +} diff --git a/kotlin-native/libllvmext/src/main/cpp/CoverageMappingC.cpp b/kotlin-native/libllvmext/src/main/cpp/CoverageMappingC.cpp index bf85398a3c8..beb68e8c134 100644 --- a/kotlin-native/libllvmext/src/main/cpp/CoverageMappingC.cpp +++ b/kotlin-native/libllvmext/src/main/cpp/CoverageMappingC.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -232,39 +231,3 @@ void LLVMKotlinAddTargetLibraryInfoWrapperPass(LLVMPassManagerRef passManagerRef legacy::PassManagerBase *passManager = unwrap(passManagerRef); passManager->add(new TargetLibraryInfoWrapperPass(Triple(targetTriple))); } - -void LLVMAddObjCARCContractPass(LLVMPassManagerRef passManagerRef) { - legacy::PassManagerBase *passManager = unwrap(passManagerRef); - passManager->add(createObjCARCContractPass()); -} - -void LLVMKotlinInitializeTargets() { -#define INIT_LLVM_TARGET(TargetName) \ - LLVMInitialize##TargetName##TargetInfo();\ - LLVMInitialize##TargetName##Target();\ - LLVMInitialize##TargetName##TargetMC(); -#if KONAN_MACOS - INIT_LLVM_TARGET(AArch64) - INIT_LLVM_TARGET(ARM) - INIT_LLVM_TARGET(Mips) - INIT_LLVM_TARGET(X86) - INIT_LLVM_TARGET(WebAssembly) -#elif KONAN_LINUX - INIT_LLVM_TARGET(AArch64) - INIT_LLVM_TARGET(ARM) - INIT_LLVM_TARGET(Mips) - INIT_LLVM_TARGET(X86) - INIT_LLVM_TARGET(WebAssembly) -#elif KONAN_WINDOWS - INIT_LLVM_TARGET(AArch64) - INIT_LLVM_TARGET(ARM) - INIT_LLVM_TARGET(X86) - INIT_LLVM_TARGET(WebAssembly) -#endif - -#undef INIT_LLVM_TARGET -} - -void LLVMSetNoTailCall(LLVMValueRef Call) { - unwrap(Call)->setTailCallKind(CallInst::TCK_NoTail); -} diff --git a/kotlin-native/libllvmext/src/main/include/CAPIExtensions.h b/kotlin-native/libllvmext/src/main/include/CAPIExtensions.h new file mode 100644 index 00000000000..b618ec4632d --- /dev/null +++ b/kotlin-native/libllvmext/src/main/include/CAPIExtensions.h @@ -0,0 +1,28 @@ +// +// Created by Sergey.Bogolepov on 24.03.2022. +// + +#ifndef LIBLLVMEXT_EXTENSIONS_H +#define LIBLLVMEXT_EXTENSIONS_H + +#endif //LIBLLVMEXT_EXTENSIONS_H + +#include +#include + + +# ifdef __cplusplus +extern "C" { +# endif + +void LLVMKotlinAddTargetLibraryInfoWrapperPass(LLVMPassManagerRef passManagerRef, const char* targetTriple); + +void LLVMAddObjCARCContractPass(LLVMPassManagerRef passManagerRef); + +void LLVMKotlinInitializeTargets(); + +void LLVMSetNoTailCall(LLVMValueRef Call); + +# ifdef __cplusplus +} +# endif \ No newline at end of file