From 54f70a68a2be117d428bf5e136fafedd06dfd794 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 16 Dec 2020 14:32:13 +0700 Subject: [PATCH] Replace '@' with '_' in binary symbol names. '@' symbol is used for symbol versioning in GCC which leads to compilation errors in case of compiler caches usage. --- .../kotlin/backend/konan/llvm/BinaryInterface.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index b68ffe1be4e..af85951e56e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -116,11 +116,15 @@ fun IrFunction.computeFunctionName() = with(KonanBinaryInterface) { functionName fun IrFunction.computeFullName() = parent.fqNameForIrSerialization.child(Name.identifier(computeFunctionName())).asString() -fun IrFunction.computeSymbolName() = with(KonanBinaryInterface) { symbolName } +fun IrFunction.computeSymbolName() = with(KonanBinaryInterface) { symbolName }.replaceSpecialSymbols() -fun IrField.computeSymbolName() = with(KonanBinaryInterface) { symbolName } +fun IrField.computeSymbolName() = with(KonanBinaryInterface) { symbolName }.replaceSpecialSymbols() -fun IrClass.computeTypeInfoSymbolName() = with(KonanBinaryInterface) { typeInfoSymbolName } +fun IrClass.computeTypeInfoSymbolName() = with(KonanBinaryInterface) { typeInfoSymbolName }.replaceSpecialSymbols() + +private fun String.replaceSpecialSymbols() = + // '@' is used for symbol versioning in GCC: https://gcc.gnu.org/wiki/SymbolVersioning. + this.replace("@", "__at__") fun IrDeclaration.isExported() = KonanBinaryInterface.isExported(this)