From a6455a906bc0b6d71e9f45bcef1c57869dc15cb9 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 18 Jan 2022 12:03:15 +0300 Subject: [PATCH] [K/N] Fix KT-50843 Marking constants with unnamed_addr allows LLVM to merge them. --- .../org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt | 7 +++++++ .../jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt | 2 ++ 2 files changed, 9 insertions(+) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt index cb32c839d80..4333633292d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt @@ -74,6 +74,13 @@ internal class StaticData(override val context: Context): ContextUtils { LLVMSetGlobalConstant(llvmGlobal, if (value) 1 else 0) } + /** + * Globals that are marked with unnamed_addr might be merged by LLVM's ConstantMerge pass. + */ + fun setUnnamedAddr(value: Boolean) { + LLVMSetUnnamedAddr(llvmGlobal, if (value) 1 else 0) + } + fun setLinkage(value: LLVMLinkage) { LLVMSetLinkage(llvmGlobal, value) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt index c6f2bdb2bfa..af367293204 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt @@ -56,6 +56,7 @@ internal fun StaticData.createConstKotlinArray(arrayClass: IrClass, elements: Li global.setInitializer(Struct(compositeType, arrayHeader, arrayBody)) global.setConstant(true) + global.setUnnamedAddr(true) return createRef(objHeaderPtr) } @@ -65,6 +66,7 @@ internal fun StaticData.createConstKotlinObject(type: IrClass, vararg fields: Co val objHeader = objHeader(typeInfo) val global = this.placeGlobal("", Struct(objHeader, *fields)) + global.setUnnamedAddr(true) global.setConstant(true) val objHeaderPtr = global.pointer.getElementPtr(0)