From ac97437ddb64a2afa681d6d72003e908c20fe21a Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 24 Oct 2019 19:48:08 +0300 Subject: [PATCH] Fixed crash in debug info (#3491) Fixed crash in debug info --- .../jetbrains/kotlin/backend/konan/Context.kt | 2 +- .../backend/konan/llvm/BitcodePhases.kt | 2 +- .../kotlin/backend/konan/llvm/DebugUtils.kt | 2 +- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 8 +-- backend.native/llvm.def | 2 +- llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp | 68 +++++++++---------- llvmDebugInfoC/src/main/include/DebugInfoC.h | 2 - 7 files changed, 39 insertions(+), 47 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 1f65a987884..8e4e1ae004b 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -333,7 +333,7 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { fun disposeLlvm() { if (llvmDisposed) return if (::debugInfo.isInitialized) - DIDispose(debugInfo.builder) + LLVMDisposeDIBuilder(debugInfo.builder) if (llvmModule != null) LLVMDisposeModule(llvmModule) if (::llvm.isInitialized) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt index 3559ed6d20a..35bdf0d1b9e 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt @@ -29,7 +29,7 @@ internal val contextLLVMSetupPhase = makeKonanModuleOpPhase( llvmContext = LLVMContextCreate()!! val llvmModule = LLVMModuleCreateWithNameInContext("out", llvmContext)!! context.llvmModule = llvmModule - context.debugInfo.builder = DICreateBuilder(llvmModule) + context.debugInfo.builder = LLVMCreateDIBuilder(llvmModule) } ) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt index 4ad186fb27c..1a5c03400c9 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt @@ -128,7 +128,7 @@ internal fun generateDebugInfoHeader(context: Context) { @Suppress("UNCHECKED_CAST") context.debugInfo.module = DICreateModule( builder = context.debugInfo.builder, - scope = context.llvmModule as DIScopeOpaqueRef, + scope = null, name = path.path(), configurationMacro = "", includePath = "", diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 2f6724d7e60..25b78231e28 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1704,13 +1704,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map() @Suppress("UNCHECKED_CAST") val scope = if (isExported && context.shouldContainDebugInfo()) - DICreateReplaceableCompositeType( - tag = DwarfTag.DW_TAG_structure_type.value, - refBuilder = context.debugInfo.builder, - refScope = (currentCodeContext.fileScope() as FileScope).file.file() as DIScopeOpaqueRef, - name = clazz.typeInfoSymbolName, - refFile = file().file(), - line = clazz.startLine()) as DITypeOpaqueRef + context.debugInfo.objHeaderPointerType else null override fun classScope(): CodeContext? = this } diff --git a/backend.native/llvm.def b/backend.native/llvm.def index 640f86e5af2..f89051b52aa 100644 --- a/backend.native/llvm.def +++ b/backend.native/llvm.def @@ -1,7 +1,7 @@ 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 \ - DebugInfoC.h CoverageMappingC.h + llvm-c/DebugInfo.h DebugInfoC.h CoverageMappingC.h headerFilter = llvm-c/* llvm-c/**/* DebugInfoC.h CoverageMappingC.h diff --git a/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp b/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp index 8e025020846..8d07c27ea21 100644 --- a/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp +++ b/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include #include @@ -21,6 +22,7 @@ #include #include #include +#include #include "DebugInfoC.h" /** * c++ --std=c++14 llvmDebugInfoC/src/DebugInfoC.cpp -IllvmDebugInfoC/include/ -Idependencies/all/clang+llvm-3.9.0-darwin-macos/include -Ldependencies/all/clang+llvm-3.9.0-darwin-macos/lib -lLLVMCore -lLLVMSupport -lncurses -shared -o libLLVMDebugInfoC.dylib @@ -52,20 +54,11 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIExpression, DIExpressionRef) #define DI_FORWARD_DECLARAION (4) extern "C" { -DIBuilderRef DICreateBuilder(LLVMModuleRef module) { - return llvm::wrap(new llvm::DIBuilder(* llvm::unwrap(module))); -} - void DIFinalize(DIBuilderRef builder) { auto diBuilder = llvm::unwrap(builder); diBuilder->finalize(); } -void DIDispose(DIBuilderRef builder) { - auto diBuilder = llvm::unwrap(builder); - delete diBuilder; -} - DICompileUnitRef DICreateCompilationUnit(DIBuilderRef builder, unsigned int lang, const char *file, const char* dir, const char * producer, int isOptimized, @@ -128,21 +121,15 @@ DICompositeTypeRef DICreateStructType(DIBuilderRef refBuilder, DICompositeTypeRef refPlace) { auto builder = llvm::unwrap(refBuilder); if ((flags & DI_FORWARD_DECLARAION) != 0) { - return llvm::wrap(builder->createStructType(llvm::unwrap(scope), name, NULL, 0, 0, 0, (llvm::DINode::DIFlags)flags, NULL, NULL)); + auto tmp = builder->createReplaceableCompositeType( + llvm::dwarf::DW_TAG_structure_type, name, llvm::unwrap(scope), llvm::unwrap(file), lineNumber, 0, sizeInBits, alignInBits, + (llvm::DINode::DIFlags)flags); + builder->replaceTemporary(llvm::TempDIType(tmp), tmp); + builder->retainType(tmp); + return llvm::wrap(tmp); } - std::vector typeElements; - for(int i = 0; i < elementsCount; ++i) { - typeElements.push_back(llvm::unwrap(elements[i])); - } - auto elementsArray = builder->getOrCreateArray(typeElements); - auto composite = builder->createStructType(llvm::unwrap(scope), - name, llvm::unwrap(file), - lineNumber, - sizeInBits, alignInBits, (llvm::DINode::DIFlags)flags, - llvm::unwrap(derivedFrom), - elementsArray); - builder->replaceTemporary(llvm::TempDIType(llvm::unwrap(refPlace)), composite); - return llvm::wrap(composite); + assert(false); + return nullptr; } @@ -152,8 +139,10 @@ DICompositeTypeRef DICreateArrayType(DIBuilderRef refBuilder, uint64_t elementsCount) { auto builder = llvm::unwrap(refBuilder); auto range = std::vector({llvm::dyn_cast(builder->getOrCreateSubrange(0, size))}); - return llvm::wrap(builder->createArrayType(size, alignInBits, llvm::unwrap(refType), - builder->getOrCreateArray(range))); + auto type = builder->createArrayType(size, alignInBits, llvm::unwrap(refType), + builder->getOrCreateArray(range)); + builder->retainType(type); + return llvm::wrap(type); } @@ -185,20 +174,29 @@ DICompositeTypeRef DICreateReplaceableCompositeType(DIBuilderRef refBuilder, DIScopeOpaqueRef refScope, DIFileRef refFile, unsigned line) { - return llvm::wrap(llvm::unwrap(refBuilder)->createReplaceableCompositeType( - tag, name, llvm::unwrap(refScope), llvm::unwrap(refFile), line)); + auto builder = llvm::unwrap(refBuilder); + auto type = builder->createReplaceableCompositeType( + tag, name, llvm::unwrap(refScope), llvm::unwrap(refFile), line); + builder->retainType(type); + return llvm::wrap(type); } DIDerivedTypeRef DICreateReferenceType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) { - return llvm::wrap(llvm::unwrap(refBuilder)->createReferenceType( - llvm::dwarf::DW_TAG_reference_type, - llvm::unwrap(refType))); + auto builder = llvm::unwrap(refBuilder); + auto type = builder->createReferenceType( + llvm::dwarf::DW_TAG_reference_type, + llvm::unwrap(refType)); + builder->retainType(type); + return llvm::wrap(type); } DIDerivedTypeRef DICreatePointerType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) { - return llvm::wrap(llvm::unwrap(refBuilder)->createReferenceType( - llvm::dwarf::DW_TAG_pointer_type, - llvm::unwrap(refType))); + auto builder = llvm::unwrap(refBuilder); + auto type = builder->createReferenceType( + llvm::dwarf::DW_TAG_pointer_type, + llvm::unwrap(refType)); + builder->retainType(type); + return llvm::wrap(type); } DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder, @@ -210,7 +208,9 @@ DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder, } llvm::DIBuilder *b = llvm::unwrap(builder); llvm::DITypeRefArray typeArray = b->getOrCreateTypeArray(parameterTypes); - return llvm::wrap(b->createSubroutineType(typeArray)); + auto type = b->createSubroutineType(typeArray); + b->retainType(type); + return llvm::wrap(type); } void DIFunctionAddSubprogram(LLVMValueRef fn, DISubprogramRef sp) { diff --git a/llvmDebugInfoC/src/main/include/DebugInfoC.h b/llvmDebugInfoC/src/main/include/DebugInfoC.h index 59079a24397..0ef7ea747f3 100644 --- a/llvmDebugInfoC/src/main/include/DebugInfoC.h +++ b/llvmDebugInfoC/src/main/include/DebugInfoC.h @@ -38,9 +38,7 @@ typedef struct DILocation *DILocationRef; typedef struct DILocalVariable *DILocalVariableRef; typedef struct DIExpression *DIExpressionRef; -DIBuilderRef DICreateBuilder(LLVMModuleRef module); void DIFinalize(DIBuilderRef builder); -void DIDispose(DIBuilderRef builder); DICompileUnitRef DICreateCompilationUnit(DIBuilderRef builder, unsigned int lang, const char *File, const char* dir, const char * producer, int isOptimized, const char * flags, unsigned int rv);