DEBUGINFO: binding enchancement && composite type support

- structured datatypes usable in debug info
- bindings for llvm/Support/Dwarf.h (llvm 3.9) makes easier introducing dwarf constants from LLVM
- added HANDLE_DW_LANG generating sequence DW_LANGs (DW_LANG_Kotlin equals DW_LANG_C89 for now).
- refactoring : g/c typo
- tag (DwarfTag) of the type added as parameter in DICreateReplaceableCompositeType
- binding for creating reference type
- binding for creating array type.
This commit is contained in:
Vasily Levchenko
2017-04-24 18:49:23 +03:00
committed by vvlevchenko
parent 8fbc06809a
commit dc8bcc677a
4 changed files with 309 additions and 1 deletions
@@ -0,0 +1,41 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.backend.konan.llvm
/**
* This code was generated with following command:
* $ clang -xc -E -Idist/dependencies/clang-llvm-3.9.0-darwin-macos/include/ llvmDebugInfoC/src/dwarf/include/dwarf_util.kt.pp -Wp,-P -Wp,-CC -o - | sed -e '/^$/d' -e '/^\ *\/\/.*$/d' > backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Dwarf.kt
*
*/
internal enum class DwarfTag(val value:Int) {
#define HANDLE_DW_TAG(ID, NAME) DW_TAG_##NAME(ID),
#include "llvm/Support/Dwarf.def"
#undef HANDLE_DW_TAG
}
internal enum class DwarfTypeKind(val value:Byte) {
#define HANDLE_DW_ATE(ID, NAME) DW_ATE_##NAME(ID),
#include "llvm/Support/Dwarf.def"
#undef HANDLE_DW_ATE
}
internal enum class DwarfLanguage(val value:Int) {
#define HANDLE_DW_LANG(ID, NAME) DW_LANG_##NAME(ID),
#include "llvm/Support/Dwarf.def"
#undef HANDLE_DW_LANG
DW_LANG_Kotlin(0x0001) /* manually added, should be changed someday. */
}
+76 -1
View File
@@ -33,7 +33,9 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIBuilder, DIBuilderRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DICompileUnit, DICompileUnitRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIFile, DIFileRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIBasicType, DIBasicTypeRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DICompositeType, DICompositeTypeRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIType, DITypeOpaqueRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIDerivedType, DIDerivedTypeRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIModule, DIModuleRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIScope, DIScopeOpaqueRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DISubroutineType, DISubroutineTypeRef)
@@ -95,7 +97,80 @@ DISubprogramRef DICreateFunction(DIBuilderRef builder, DIScopeOpaqueRef scope,
scopeLine));
}
/* */
DICompositeTypeRef DICreateStructType(DIBuilderRef refBuilder,
DIScopeOpaqueRef scope, const char *name,
DIFileRef file, unsigned lineNumber,
uint64_t sizeInBits, uint64_t alignInBits,
unsigned flags, DITypeOpaqueRef derivedFrom,
DIDerivedTypeRef *elements,
uint64_t elementsCount,
DICompositeTypeRef refPlace) {
auto builder = llvm::unwrap(refBuilder);
std::vector<llvm::Metadata *> 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, flags,
llvm::unwrap(derivedFrom),
elementsArray);
builder->replaceTemporary(llvm::TempDIType(llvm::unwrap(refPlace)), composite);
return llvm::wrap(composite);
}
DICompositeTypeRef DICreateArrayType(DIBuilderRef refBuilder,
uint64_t size, uint64_t alignInBits,
DITypeOpaqueRef refType,
uint64_t elementsCount) {
auto builder = llvm::unwrap(refBuilder);
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),
builder->getOrCreateArray(range)));
}
DIDerivedTypeRef DICreateMemberType(DIBuilderRef refBuilder,
DIScopeOpaqueRef refScope,
const char *name,
DIFileRef file,
unsigned lineNum,
uint64_t sizeInBits,
uint64_t alignInBits,
uint64_t offsetInBits,
unsigned flags,
DITypeOpaqueRef type) {
return llvm::wrap(llvm::unwrap(refBuilder)->createMemberType(
llvm::unwrap(refScope),
name,
llvm::unwrap(file),
lineNum,
sizeInBits,
alignInBits,
offsetInBits,
flags,
llvm::unwrap(type)));
}
DICompositeTypeRef DICreateReplaceableCompositeType(DIBuilderRef refBuilder,
int tag,
const char *name,
DIScopeOpaqueRef refScope,
DIFileRef refFile,
unsigned line) {
return llvm::wrap(llvm::unwrap(refBuilder)->createReplaceableCompositeType(
tag, name, llvm::unwrap(refScope), llvm::unwrap(refFile), line));
}
DIDerivedTypeRef DICreateReferenceType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) {
return llvm::wrap(llvm::unwrap(refBuilder)->createReferenceType(
llvm::dwarf::DW_TAG_reference_type,
llvm::unwrap(refType)));
}
DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder,
DITypeOpaqueRef* types,
unsigned typesCount) {
@@ -24,6 +24,8 @@ typedef struct DIBuilder *DIBuilderRef;
typedef struct DICompileUnit *DICompileUnitRef;
typedef struct DIFile *DIFileRef;
typedef struct DIBasicType *DIBasicTypeRef;
typedef struct DICompositeType *DICompositeTypeRef;
typedef struct DIDerivedType *DIDerivedTypeRef;
typedef struct DIType *DITypeOpaqueRef;
typedef struct DISubprogram *DISubprogramRef;
typedef struct DIModule *DIModuleRef;
@@ -43,6 +45,38 @@ DIFileRef DICreateFile(DIBuilderRef builder, const char *filename, const char *d
DIBasicTypeRef DICreateBasicType(DIBuilderRef builder, const char* name, uint64_t sizeInBits, uint64_t alignment, unsigned encoding);
DICompositeTypeRef DICreateStructType(DIBuilderRef refBuilder,
DIScopeOpaqueRef scope, const char *name,
DIFileRef file, unsigned lineNumber,
uint64_t sizeInBits, uint64_t alignInBits,
unsigned flags, DITypeOpaqueRef derivedFrom,
DIDerivedTypeRef *elements,
uint64_t elementsCount,
DICompositeTypeRef refPlace);
DICompositeTypeRef DICreateArrayType(DIBuilderRef refBuilder,
uint64_t size, uint64_t alignInBits,
DITypeOpaqueRef type,
uint64_t elementsCount);
DIDerivedTypeRef DICreateReferenceType(DIBuilderRef refBuilder, DITypeOpaqueRef refType);
DICompositeTypeRef DICreateReplaceableCompositeType(DIBuilderRef refBuilder,
int tag,
const char *name,
DIScopeOpaqueRef refScope,
DIFileRef refFile,
unsigned line);
DIDerivedTypeRef DICreateMemberType(DIBuilderRef refBuilder,
DIScopeOpaqueRef refScope,
const char *name,
DIFileRef file,
unsigned lineNum,
uint64_t sizeInBits,
uint64_t alignInBits,
uint64_t offsetInBits,
unsigned flags,
DITypeOpaqueRef type);
DIModuleRef DICreateModule(DIBuilderRef builder, DIScopeOpaqueRef scope,
const char* name, const char* configurationMacro,
const char* includePath, const char *iSysRoot);