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
+158
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
* 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) {
|
||||
DW_TAG_array_type(0x0001),
|
||||
DW_TAG_class_type(0x0002),
|
||||
DW_TAG_entry_point(0x0003),
|
||||
DW_TAG_enumeration_type(0x0004),
|
||||
DW_TAG_formal_parameter(0x0005),
|
||||
DW_TAG_imported_declaration(0x0008),
|
||||
DW_TAG_label(0x000a),
|
||||
DW_TAG_lexical_block(0x000b),
|
||||
DW_TAG_member(0x000d),
|
||||
DW_TAG_pointer_type(0x000f),
|
||||
DW_TAG_reference_type(0x0010),
|
||||
DW_TAG_compile_unit(0x0011),
|
||||
DW_TAG_string_type(0x0012),
|
||||
DW_TAG_structure_type(0x0013),
|
||||
DW_TAG_subroutine_type(0x0015),
|
||||
DW_TAG_typedef(0x0016),
|
||||
DW_TAG_union_type(0x0017),
|
||||
DW_TAG_unspecified_parameters(0x0018),
|
||||
DW_TAG_variant(0x0019),
|
||||
DW_TAG_common_block(0x001a),
|
||||
DW_TAG_common_inclusion(0x001b),
|
||||
DW_TAG_inheritance(0x001c),
|
||||
DW_TAG_inlined_subroutine(0x001d),
|
||||
DW_TAG_module(0x001e),
|
||||
DW_TAG_ptr_to_member_type(0x001f),
|
||||
DW_TAG_set_type(0x0020),
|
||||
DW_TAG_subrange_type(0x0021),
|
||||
DW_TAG_with_stmt(0x0022),
|
||||
DW_TAG_access_declaration(0x0023),
|
||||
DW_TAG_base_type(0x0024),
|
||||
DW_TAG_catch_block(0x0025),
|
||||
DW_TAG_const_type(0x0026),
|
||||
DW_TAG_constant(0x0027),
|
||||
DW_TAG_enumerator(0x0028),
|
||||
DW_TAG_file_type(0x0029),
|
||||
DW_TAG_friend(0x002a),
|
||||
DW_TAG_namelist(0x002b),
|
||||
DW_TAG_namelist_item(0x002c),
|
||||
DW_TAG_packed_type(0x002d),
|
||||
DW_TAG_subprogram(0x002e),
|
||||
DW_TAG_template_type_parameter(0x002f),
|
||||
DW_TAG_template_value_parameter(0x0030),
|
||||
DW_TAG_thrown_type(0x0031),
|
||||
DW_TAG_try_block(0x0032),
|
||||
DW_TAG_variant_part(0x0033),
|
||||
DW_TAG_variable(0x0034),
|
||||
DW_TAG_volatile_type(0x0035),
|
||||
DW_TAG_dwarf_procedure(0x0036),
|
||||
DW_TAG_restrict_type(0x0037),
|
||||
DW_TAG_interface_type(0x0038),
|
||||
DW_TAG_namespace(0x0039),
|
||||
DW_TAG_imported_module(0x003a),
|
||||
DW_TAG_unspecified_type(0x003b),
|
||||
DW_TAG_partial_unit(0x003c),
|
||||
DW_TAG_imported_unit(0x003d),
|
||||
DW_TAG_condition(0x003f),
|
||||
DW_TAG_shared_type(0x0040),
|
||||
DW_TAG_type_unit(0x0041),
|
||||
DW_TAG_rvalue_reference_type(0x0042),
|
||||
DW_TAG_template_alias(0x0043),
|
||||
DW_TAG_coarray_type(0x0044),
|
||||
DW_TAG_generic_subrange(0x0045),
|
||||
DW_TAG_dynamic_type(0x0046),
|
||||
DW_TAG_MIPS_loop(0x4081),
|
||||
DW_TAG_format_label(0x4101),
|
||||
DW_TAG_function_template(0x4102),
|
||||
DW_TAG_class_template(0x4103),
|
||||
DW_TAG_GNU_template_template_param(0x4106),
|
||||
DW_TAG_GNU_template_parameter_pack(0x4107),
|
||||
DW_TAG_GNU_formal_parameter_pack(0x4108),
|
||||
DW_TAG_APPLE_property(0x4200),
|
||||
DW_TAG_BORLAND_property(0xb000),
|
||||
DW_TAG_BORLAND_Delphi_string(0xb001),
|
||||
DW_TAG_BORLAND_Delphi_dynamic_array(0xb002),
|
||||
DW_TAG_BORLAND_Delphi_set(0xb003),
|
||||
DW_TAG_BORLAND_Delphi_variant(0xb004),
|
||||
}
|
||||
internal enum class DwarfTypeKind(val value:Byte) {
|
||||
DW_ATE_address(0x01),
|
||||
DW_ATE_boolean(0x02),
|
||||
DW_ATE_complex_float(0x03),
|
||||
DW_ATE_float(0x04),
|
||||
DW_ATE_signed(0x05),
|
||||
DW_ATE_signed_char(0x06),
|
||||
DW_ATE_unsigned(0x07),
|
||||
DW_ATE_unsigned_char(0x08),
|
||||
DW_ATE_imaginary_float(0x09),
|
||||
DW_ATE_packed_decimal(0x0a),
|
||||
DW_ATE_numeric_string(0x0b),
|
||||
DW_ATE_edited(0x0c),
|
||||
DW_ATE_signed_fixed(0x0d),
|
||||
DW_ATE_unsigned_fixed(0x0e),
|
||||
DW_ATE_decimal_float(0x0f),
|
||||
DW_ATE_UTF(0x10),
|
||||
}
|
||||
internal enum class DwarfLanguage(val value:Int) {
|
||||
DW_LANG_C89(0x0001),
|
||||
DW_LANG_C(0x0002),
|
||||
DW_LANG_Ada83(0x0003),
|
||||
DW_LANG_C_plus_plus(0x0004),
|
||||
DW_LANG_Cobol74(0x0005),
|
||||
DW_LANG_Cobol85(0x0006),
|
||||
DW_LANG_Fortran77(0x0007),
|
||||
DW_LANG_Fortran90(0x0008),
|
||||
DW_LANG_Pascal83(0x0009),
|
||||
DW_LANG_Modula2(0x000a),
|
||||
DW_LANG_Java(0x000b),
|
||||
DW_LANG_C99(0x000c),
|
||||
DW_LANG_Ada95(0x000d),
|
||||
DW_LANG_Fortran95(0x000e),
|
||||
DW_LANG_PLI(0x000f),
|
||||
DW_LANG_ObjC(0x0010),
|
||||
DW_LANG_ObjC_plus_plus(0x0011),
|
||||
DW_LANG_UPC(0x0012),
|
||||
DW_LANG_D(0x0013),
|
||||
DW_LANG_Python(0x0014),
|
||||
DW_LANG_OpenCL(0x0015),
|
||||
DW_LANG_Go(0x0016),
|
||||
DW_LANG_Modula3(0x0017),
|
||||
DW_LANG_Haskell(0x0018),
|
||||
DW_LANG_C_plus_plus_03(0x0019),
|
||||
DW_LANG_C_plus_plus_11(0x001a),
|
||||
DW_LANG_OCaml(0x001b),
|
||||
DW_LANG_Rust(0x001c),
|
||||
DW_LANG_C11(0x001d),
|
||||
DW_LANG_Swift(0x001e),
|
||||
DW_LANG_Julia(0x001f),
|
||||
DW_LANG_Dylan(0x0020),
|
||||
DW_LANG_C_plus_plus_14(0x0021),
|
||||
DW_LANG_Fortran03(0x0022),
|
||||
DW_LANG_Fortran08(0x0023),
|
||||
DW_LANG_Mips_Assembler(0x8001),
|
||||
DW_LANG_GOOGLE_RenderScript(0x8e57),
|
||||
DW_LANG_BORLAND_Delphi(0xb000),
|
||||
DW_LANG_Kotlin(0x0001) /* manually added, should be changed someday. */
|
||||
}
|
||||
@@ -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