Fixed crash in debug info (#3491)

Fixed crash in debug info
This commit is contained in:
Igor Chevdar
2019-10-24 19:48:08 +03:00
committed by GitHub
parent 5aca1db362
commit ac97437ddb
7 changed files with 39 additions and 47 deletions
@@ -333,7 +333,7 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
fun disposeLlvm() { fun disposeLlvm() {
if (llvmDisposed) return if (llvmDisposed) return
if (::debugInfo.isInitialized) if (::debugInfo.isInitialized)
DIDispose(debugInfo.builder) LLVMDisposeDIBuilder(debugInfo.builder)
if (llvmModule != null) if (llvmModule != null)
LLVMDisposeModule(llvmModule) LLVMDisposeModule(llvmModule)
if (::llvm.isInitialized) if (::llvm.isInitialized)
@@ -29,7 +29,7 @@ internal val contextLLVMSetupPhase = makeKonanModuleOpPhase(
llvmContext = LLVMContextCreate()!! llvmContext = LLVMContextCreate()!!
val llvmModule = LLVMModuleCreateWithNameInContext("out", llvmContext)!! val llvmModule = LLVMModuleCreateWithNameInContext("out", llvmContext)!!
context.llvmModule = llvmModule context.llvmModule = llvmModule
context.debugInfo.builder = DICreateBuilder(llvmModule) context.debugInfo.builder = LLVMCreateDIBuilder(llvmModule)
} }
) )
@@ -128,7 +128,7 @@ internal fun generateDebugInfoHeader(context: Context) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
context.debugInfo.module = DICreateModule( context.debugInfo.module = DICreateModule(
builder = context.debugInfo.builder, builder = context.debugInfo.builder,
scope = context.llvmModule as DIScopeOpaqueRef, scope = null,
name = path.path(), name = path.path(),
configurationMacro = "", configurationMacro = "",
includePath = "", includePath = "",
@@ -1704,13 +1704,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
val members = mutableListOf<DIDerivedTypeRef>() val members = mutableListOf<DIDerivedTypeRef>()
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val scope = if (isExported && context.shouldContainDebugInfo()) val scope = if (isExported && context.shouldContainDebugInfo())
DICreateReplaceableCompositeType( context.debugInfo.objHeaderPointerType
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
else null else null
override fun classScope(): CodeContext? = this override fun classScope(): CodeContext? = this
} }
+1 -1
View File
@@ -1,7 +1,7 @@
headers = llvm-c/Core.h llvm-c/Target.h llvm-c/Analysis.h llvm-c/BitWriter.h \ 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/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/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 headerFilter = llvm-c/* llvm-c/**/* DebugInfoC.h CoverageMappingC.h
+34 -34
View File
@@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include <assert.h>
#include <llvm/IR/DebugInfo.h> #include <llvm/IR/DebugInfo.h>
#include <llvm/IR/Function.h> #include <llvm/IR/Function.h>
#include <llvm/IR/IRBuilder.h> #include <llvm/IR/IRBuilder.h>
@@ -21,6 +22,7 @@
#include <llvm/IR/DebugInfoMetadata.h> #include <llvm/IR/DebugInfoMetadata.h>
#include <llvm/IR/Instruction.h> #include <llvm/IR/Instruction.h>
#include <llvm/Support/Casting.h> #include <llvm/Support/Casting.h>
#include <llvm-c/DebugInfo.h>
#include "DebugInfoC.h" #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 * 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) #define DI_FORWARD_DECLARAION (4)
extern "C" { extern "C" {
DIBuilderRef DICreateBuilder(LLVMModuleRef module) {
return llvm::wrap(new llvm::DIBuilder(* llvm::unwrap(module)));
}
void DIFinalize(DIBuilderRef builder) { void DIFinalize(DIBuilderRef builder) {
auto diBuilder = llvm::unwrap(builder); auto diBuilder = llvm::unwrap(builder);
diBuilder->finalize(); diBuilder->finalize();
} }
void DIDispose(DIBuilderRef builder) {
auto diBuilder = llvm::unwrap(builder);
delete diBuilder;
}
DICompileUnitRef DICreateCompilationUnit(DIBuilderRef builder, unsigned int lang, DICompileUnitRef DICreateCompilationUnit(DIBuilderRef builder, unsigned int lang,
const char *file, const char* dir, const char *file, const char* dir,
const char * producer, int isOptimized, const char * producer, int isOptimized,
@@ -128,21 +121,15 @@ DICompositeTypeRef DICreateStructType(DIBuilderRef refBuilder,
DICompositeTypeRef refPlace) { DICompositeTypeRef refPlace) {
auto builder = llvm::unwrap(refBuilder); auto builder = llvm::unwrap(refBuilder);
if ((flags & DI_FORWARD_DECLARAION) != 0) { 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<llvm::Metadata *> typeElements; assert(false);
for(int i = 0; i < elementsCount; ++i) { return nullptr;
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);
} }
@@ -152,8 +139,10 @@ DICompositeTypeRef DICreateArrayType(DIBuilderRef refBuilder,
uint64_t elementsCount) { uint64_t elementsCount) {
auto builder = llvm::unwrap(refBuilder); auto builder = llvm::unwrap(refBuilder);
auto range = std::vector<llvm::Metadata*>({llvm::dyn_cast<llvm::Metadata>(builder->getOrCreateSubrange(0, size))}); auto range = std::vector<llvm::Metadata*>({llvm::dyn_cast<llvm::Metadata>(builder->getOrCreateSubrange(0, size))});
return llvm::wrap(builder->createArrayType(size, alignInBits, llvm::unwrap(refType), auto type = builder->createArrayType(size, alignInBits, llvm::unwrap(refType),
builder->getOrCreateArray(range))); builder->getOrCreateArray(range));
builder->retainType(type);
return llvm::wrap(type);
} }
@@ -185,20 +174,29 @@ DICompositeTypeRef DICreateReplaceableCompositeType(DIBuilderRef refBuilder,
DIScopeOpaqueRef refScope, DIScopeOpaqueRef refScope,
DIFileRef refFile, DIFileRef refFile,
unsigned line) { unsigned line) {
return llvm::wrap(llvm::unwrap(refBuilder)->createReplaceableCompositeType( auto builder = llvm::unwrap(refBuilder);
tag, name, llvm::unwrap(refScope), llvm::unwrap(refFile), line)); 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) { DIDerivedTypeRef DICreateReferenceType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) {
return llvm::wrap(llvm::unwrap(refBuilder)->createReferenceType( auto builder = llvm::unwrap(refBuilder);
llvm::dwarf::DW_TAG_reference_type, auto type = builder->createReferenceType(
llvm::unwrap(refType))); llvm::dwarf::DW_TAG_reference_type,
llvm::unwrap(refType));
builder->retainType(type);
return llvm::wrap(type);
} }
DIDerivedTypeRef DICreatePointerType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) { DIDerivedTypeRef DICreatePointerType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) {
return llvm::wrap(llvm::unwrap(refBuilder)->createReferenceType( auto builder = llvm::unwrap(refBuilder);
llvm::dwarf::DW_TAG_pointer_type, auto type = builder->createReferenceType(
llvm::unwrap(refType))); llvm::dwarf::DW_TAG_pointer_type,
llvm::unwrap(refType));
builder->retainType(type);
return llvm::wrap(type);
} }
DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder, DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder,
@@ -210,7 +208,9 @@ DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder,
} }
llvm::DIBuilder *b = llvm::unwrap(builder); llvm::DIBuilder *b = llvm::unwrap(builder);
llvm::DITypeRefArray typeArray = b->getOrCreateTypeArray(parameterTypes); 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) { void DIFunctionAddSubprogram(LLVMValueRef fn, DISubprogramRef sp) {
@@ -38,9 +38,7 @@ typedef struct DILocation *DILocationRef;
typedef struct DILocalVariable *DILocalVariableRef; typedef struct DILocalVariable *DILocalVariableRef;
typedef struct DIExpression *DIExpressionRef; typedef struct DIExpression *DIExpressionRef;
DIBuilderRef DICreateBuilder(LLVMModuleRef module);
void DIFinalize(DIBuilderRef builder); 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); DICompileUnitRef DICreateCompilationUnit(DIBuilderRef builder, unsigned int lang, const char *File, const char* dir, const char * producer, int isOptimized, const char * flags, unsigned int rv);