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:
committed by
vvlevchenko
parent
8fbc06809a
commit
dc8bcc677a
@@ -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. */
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user