diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt index 58fa1349f13..0bd681f308a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt @@ -22,6 +22,7 @@ private fun initializeLlvmGlobalPassRegistry() { LLVMInitializeIPA(passRegistry) LLVMInitializeCodeGen(passRegistry) LLVMInitializeTarget(passRegistry) + LLVMInitializeObjCARCOpts(passRegistry) } internal fun shouldRunLateBitcodePasses(context: Context): Boolean { @@ -166,10 +167,16 @@ internal fun runLlvmOptimizationPipeline(context: Context) { config.customInlineThreshold?.let { threshold -> LLVMPassManagerBuilderUseInlinerWithThreshold(passBuilder, threshold) } + // Pipeline that is similar to `llvm-lto`. - // TODO: Add ObjC optimization passes. LLVMPassManagerBuilderPopulateLTOPassManager(passBuilder, modulePasses, Internalize = 0, RunInliner = 1) + // Lower ObjC ARC intrinsics (e.g. `@llvm.objc.clang.arc.use(...)`). + // While Kotlin/Native codegen itself doesn't produce these intrinsics, they might come + // from cinterop "glue" bitcode. + // TODO: Consider adding other ObjC passes. + LLVMAddObjCARCContractPass(modulePasses) + LLVMRunPassManager(modulePasses, llvmModule) LLVMPassManagerBuilderDispose(passBuilder) diff --git a/kotlin-native/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp b/kotlin-native/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp index 4a5c2506c9c..52663cb8b32 100644 --- a/kotlin-native/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp +++ b/kotlin-native/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp @@ -19,8 +19,10 @@ #include #include #include +#include #include #include + #include #include #include @@ -230,6 +232,11 @@ void LLVMKotlinAddTargetLibraryInfoWrapperPass(LLVMPassManagerRef 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();\ diff --git a/kotlin-native/llvmCoverageMappingC/src/main/include/CoverageMappingC.h b/kotlin-native/llvmCoverageMappingC/src/main/include/CoverageMappingC.h index a0160c2afcf..56f9765660f 100644 --- a/kotlin-native/llvmCoverageMappingC/src/main/include/CoverageMappingC.h +++ b/kotlin-native/llvmCoverageMappingC/src/main/include/CoverageMappingC.h @@ -74,6 +74,8 @@ void LLVMAddInstrProfPass(LLVMPassManagerRef passManagerRef, const char* outputF void LLVMKotlinAddTargetLibraryInfoWrapperPass(LLVMPassManagerRef passManagerRef, const char* targetTriple); +void LLVMAddObjCARCContractPass(LLVMPassManagerRef passManagerRef); + void LLVMKotlinInitializeTargets(); # ifdef __cplusplus