+1
-1
@@ -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)
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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 = "",
|
||||||
|
|||||||
+1
-7
@@ -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,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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user